靶场环境:sqli-labs-master
报错注入
没有回显,但是会输出sql语句执行错误信息。
没有sql语句的错误页面不会提示其他信息
如图我输入了id=1'导致了单引号没有闭合,发生了报错
报错注入的分类
MySQL
的报错注入主要是利用
MySQL
的一些逻辑漏洞,根据漏洞 原因的不同,可以将MySQL
报错注入分为以下几类:
BigInt
等数据类型溢出
xpath
语法错误
count()+rand()+group_by()
导致主键重复 空间数据类型函数错误
xpath语法错误
从
mysql5.1.5
开始提供了两个
XML
查询和修改的函数:
1. updatexml()
:适用于
5.5.5-5.5.49
版本
2. extractvalue()
:适用于
5.1.5+
版本
可以通过
xml
函数报错,来显示注入命令执行结果。
updatexml
函数格式:
updatexml((XML_document, XPath_string,new_value)
XML_document
:
xml
文档的名称
XPath_string
:
xpath
格式的字符串
new_value
:替换查找到的符合条件的数据
extractvalue
函数格式:
extractvalue((XML_document, XPath_string),除了没有第三个参数(
new_value
),其它与updataxml()函数完全一样。所以后面只讲
updatexml()
函数的使用。
简而言之,updatexml函数功能就是查找一个字符串,并进行替换。而我们在XPath_string处也就是第二个参数那里传入不符合xpath格式的特殊字符,并加上一些查询语句,mysql就会把错误和查询语句的结果报错显示出来。这就是xpath报错注入的原理。
注意事项:
必须是在
XPath_string
处传特殊字符,
mysql
才会报错,同时我们还需要注入命令,没这么多位置,所以要用到concat
函数。xpath只会对特殊字符进行报错,这里我们可以用
16
进制的
0x7e
(
~
)来进行利用。xpath只会报错
32
个字符,对于输出结果大于
32
个字符的命令,
要用
substr
函数截取后分段输出。
函数说明:
concat(s1,s2...sn)
:将字符串
s1,s2...sn
合并为一个字符串。
substr(s, start, length)
:从字符串
s
的
start
位置截取长度为length 的子字符串,
start
从
1
开始。
注入过程
1.判断注入类型
这里我输入id=1'引起了单引号不匹配,所以给我提示了报错信息
确认了两点一个是报错注入,一个是单引号闭合(字符型)
我将数据库原本存在的'注释掉发现正常显示了
2.获取数据库名
使用updatxml()函数
可以看到报错信息内正是我们输入的0x7e(~)包裹着数据库名 security
3.获取表名
这里的语句就和普通注入语句没什么区别了,在concat()函数中输入对应查询语句即可
表名分别是emails,referers,uagents,users
4.获取字段
获取users表的字段
5.获取字段记录
获取username字段的记录
虽然成功查询到记录但是我我们可以观察到,后面的~并没有显示出来,像是后面还有一段内容没有显示,这是由于xpath只会报错32个字符,所以可以使用substr()函数进行字符串截取
可以看到我们先截取30个字符显示如下结果,后面还有数据。那么我们就可以从31位开始截取
如果还没显示完,我们可以继续以此方式截取。
后续内容相信大家已经能够举一反三了。如果对查询语句不熟悉可以查看我前几篇文章