sql注入之order by猜列数问题

环境: xampp-win32-5.6.3-0-VC11  dvwa-1.0.8

前言

有幸在网上搜到一款非常不错的渗透测试演练系统 — dvwa ,作为学习,演练真的非常强大啊! 在学习的过程中也遇到一些问题,所以这里做学习分享记录。

问题简述

在用dvwa做sql 注入检测时,遇到一个小小的问题 — order by 猜出来的列数跟数据库表中的列数不匹配。(注入时猜出来两个字段,但是实际数据库的表中却有6个字段)。在未了解之前,我一直想当然的以为 order by就是获取数据库表中的列数,在两次实际检测过程中,确实发现这个是我所不能理解的。

问题详情

在发现注入点后,进行猜列数时,用了如下语句:
sql注入之order by猜列数问题_第1张图片


sql注入之order by猜列数问题_第2张图片

故此我们猜出有两列,但是我去数据库查看相应的表时,发现字段比这个多

sql注入之order by猜列数问题_第3张图片

搞定问题

在别人的指导下作了如下分析:

将猜列数语句直接在sql数据库执行,发现他们的结果跟在web页面注入时都是不一致的

sql注入之order by猜列数问题_第4张图片

sql注入之order by猜列数问题_第5张图片

而在数据库执行得到的6列则是跟数据库匹配的,难道order by 猜的列数有问题?

最后去注入代码看到源码一下豁然开朗:

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";

你也看到了,我在mysql执行的语句是 select * ,而 注入代码则是 select first_name, last_name。

小结

网上大多资料说的order by来猜列数,实际是猜查询出的列数,而不是表实际的列数。order by本来就是指定的结果如何order,针对的就是查询结果而不是原表。所以order by猜解得到的列数还跟在后端的逻辑有关。

实用

这个有什么用?我用一个例子来简述。

在注入时,用order by 猜出结果集有两个字段,且两字段名分别为:user pwd (实际数据库表中还有id一字段)

在爆字段值时:当注入语句这样时可能什么也得不到,甚至直接报错:

代码:

and 1=2 union select user, 2 from admin 

error:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /usr/local/webroot/cw/about/index.php on line 95

这时我们需要对注入语句进行转换下:

and 1=2 union select concat(id,0x232323,user,0x232323,pwd),2 from admin

这样就能到两字段的值了

你可能感兴趣的:(sql注入之order by猜列数问题)