简介
sql注入一般分类如下:
- 基于时间注入
- 基于报错注入
- 基于联合查询注入
- 基于布尔注入
基于报错注入也是一种sql注入漏洞,漏洞原因是后端在处理用户输入时直接拼接进sql语句中进行执行,从而产生了正常业务之外的逻辑。其实本质上和xss这种代码注入类似,核心是没有区分开代码和用户输入的数据。
基于报错注入特点是页面会直接显示回显sql语句执行的报错信息,这样我们其实可以通过故意构造错误的sql语句,将我们想要执行的攻击sql语句的执行结果直接在页面上回显出来。
常见函数
mysql中最常见的利用函数就是extractvalue和updatexml这两个了,以extractvalue为例,看下它原始的用法:
ExtractValue(xml_str , Xpath) 函数,使用Xpath表示法从XML格式的字符串中提取一个值
函数利用
以上讲的是extractvalue函数的正常使用情况,但是如果我们构造了不符合规定的Xpath,mysql就会报语法错误,并显示XPath的内容,攻击者也是利用这一特性,将想要执行的攻击sql语句结果带出来。
-
.XPATH语法的报错条件是遇到特殊字符就会报错,如
~
、{
等。以~
为例,18进制为0x7e,mysql本地执行可以带出user()执行结果。
-
找个例子,可以通过extractvalue函数,成功查出当前user,可以看到并非是root权限。
payload:) and 1=(extractvalue(1,concat(0x7e,user(),0x7e))) and 1=1;
-
updatexml函数类似,如下:
payload:) and 1=(updatexml(1,concat(0x7e,user(),0x7e),1)) and 1=1;
-
另外有一点需要注意的是,报错内容不可能不限制长,其实是有一定长度限制的,报错内容大约是32个字符:
总结
在此小记下mysql基于报错注入的利用。对于互联网行业,此类注入一般比较少,最多的还是基于时间的注入。