环境: xampp-win32-5.6.3-0-VC11 dvwa-1.0.8
前言
有幸在网上搜到一款非常不错的渗透测试演练系统 — dvwa ,作为学习,演练真的非常强大啊! 在学习的过程中也遇到一些问题,所以这里做学习分享记录。
问题简述
在用dvwa做sql 注入检测时,遇到一个小小的问题 — order by 猜出来的列数跟数据库表中的列数不匹配。(注入时猜出来两个字段,但是实际数据库的表中却有6个字段)。在未了解之前,我一直想当然的以为 order by就是获取数据库表中的列数,在两次实际检测过程中,确实发现这个是我所不能理解的。
问题详情
在发现注入点后,进行猜列数时,用了如下语句:
故此我们猜出有两列,但是我去数据库查看相应的表时,发现字段比这个多
搞定问题
在别人的指导下作了如下分析:
将猜列数语句直接在sql数据库执行,发现他们的结果跟在web页面注入时都是不一致的
而在数据库执行得到的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
这样就能到两字段的值了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。