方法分類:
1、HTTP參數污染繞過
2、HTTP Header頭部欺騙繞過
3、HTTP參數溢出繞過
4、HTTP分塊傳輸繞過
5、HTTP數據編碼繞過
6、HTTP Pipline繞過(Keep-alive)
7、HTTP協議未覆蓋繞過
8、HTTP畸形包繞過
9、HTTP組合繞過
0x01 HTTP參數污染繞過
HTTP參數污染簡稱HPP
由於http協議允許同名參數的存在,同時waf的處理機制對同名參數的處理方式不同,造成“參數污染”。
假設一個url的原有參數為?id=1
那么提交的參數為:?id=1&id=2&id=3
不同的服務器搭配解析出不同的值
asp.net+iis:id=1,2,3 asp+iis:id=1,2,3 php+apache:id=3
那么如果waf檢測的是url里面的第一個id值,那么在php+apache中是不是可以讓第一個id值等於符合條件不觸碰waf的字符,第三個id寫我們自己的惡意代碼,即可繞過執行。
0x02HTTP Header頭部欺騙繞過
可以修改頭部的各個參數,比如說:
waf可能會根據頭部某個參數的值來進行是否攔截,有可能不是那個值就會攔截。
在一個請求包中我們可以加入一個緩存字段控制指令:Cache-control:no-transform
比如這樣的結構,如果某個服務器站點,它與客戶端通信的中間加了代理服務器,如果waf在代理服務器里面,那么客戶端請求包中加入緩存字段控制指令就可以直接向源服務器請求。
0x03HTTP參數溢出繞過
有些waf要檢測多個參數,比如說能檢測100個請求參數,像之前的參數污染就沒法繞過了,但是我們把該參數增加到101個,都是同名,那么第101個參數就可繞過waf了;
這是由於waf根本沒有考慮參數溢出的情況,構造超過限制的參數即可繞過安全防護。
基於OpenResty構造的WAF:ngx_lua_waf、X-WAF、Openstar等,均受參數溢出的影響(CVE-2018-9230)
0x04HTTP分塊傳輸繞過
分塊傳輸即分塊傳輸編碼,把報文分割成若干個大小已知的塊進行傳輸
長度標識處加上分號‘;’作為注釋變形請求包加強繞過能力。
0x05HTTP數據編碼繞過
編碼繞過在繞waf中也是經常遇到的,通常waf只堅持他所識別的編碼,比如說它只識別utf-8的字符,但是服務器可以識別比utf-8更多的編碼。
那么我們只需要將payload按照waf識別不了但是服務器可以解析識別的編碼格式即可繞過。
比如請求包中我們可以更改Content-Type中的charse的參數值,我們改為ibm037這個協議編碼,有些服務器是支持的。payload改成這個協議格式就行了。
0x06HTTP Pipline繞過(keep-alive)
HTTP管道化允許多個http請求通過一個套接字同時被輸出,而不用等待相應的響應。然后請求者就會等待各自的響應,這些響應是按照之前請求的順序依次到達。因為多個請求可被同時傳送,如果waf只檢測第一個請求,而忽略后面的請求,便可被攻擊者繞過。
我們把請求頭中的Connection的參數值更改為keep-alive,然后向服務器同時發這樣的三個請求過去,waf可能只檢測第一個請求,后面請求就不檢測了。那么我們將惡意代碼放在后面兩個請求中,即可達到繞過waf的目的。
0x07HTTP協議未覆蓋繞過
HTTP頭中Content-Type字段一般可以設置比較常見的四種參數提交方式:
1、application/x-www-form-urlencoded (默認編碼方式)
2、multipart/form-data (文件上傳方式指定傳輸數據為二進制數據,例如圖片、視頻、文件)
3、text/plain (純文本的傳輸;空格轉換為“+”,但不支持特殊字符編碼。)
4、application/json (json報文格式傳輸)
就比如waf只檢測普通的get和post,但是我們將請求包改為了上傳(就是改content-type),那么即可繞過waf。
0x08HTTP畸形包繞過
當前的HTTP服務依據的是RFC2616標准(通常有以下8種方法:GET、POST、PUT、OPTION、HEAD、DELETE、TRACE、CONNECT)的HTTP請求,但是當我們向web服務器發送畸形請求時,也就是並非這個標准的HTTP數據包的時候,由於web服務器的一些兼容性的特性,會盡力解析這些畸形的數據包。
正常的含有惡意代碼的數據包,比如說插入有sql語句的包:
那么正常的post包waf將會檢測到惡意代碼,就會攔截。
那么我們將請求方法改為一個不存在的http請求方法,構造成畸形包
那么waf可能說這不是post包,就不會攔截,況且這還不是其他方法的包,服務器會盡力去解這個包,可以解析那么運氣好,可以繞過超過,不能解析那么再更改一些請求頭中的參數;
例如:
head頭的conten-type:TAB Host添加空格 Host域名后面添加“.” Cookie中垃圾數據填充 filename在content-type下面 Content-Type:multipart/form-data ;boundart=0000 大小寫:Content-Type:mUltiPart/ForM-dATa; boundart=0000 Content-Type:multipart/form-dataX;boundart=0000 Content-Type:multipart/form-data,boundart=0000 Content-Type:multipart/form-data boundart=0000 Content-Type:multipart/whatever;boundart=0000 Content-Type:multipart/;boundart=0000 等...
這些也可以造成http請求包畸形。
0x09HTTP組合繞過
對於一些嚴格的waf需要配合更多繞過方法來搭配使用繞過:
1.HTTP參數溢出繞過+HTTP協議未覆蓋繞過
2.HTTP分塊傳輸繞過+HTTP數據編碼繞過
3.HTTP分塊傳輸繞過+HTTP協議未覆蓋繞過
4.HTTP協議未覆蓋繞過+HTTP畸形包繞過+HTTP數據編碼繞過
5.HTTP畸形包+HTTP協議未覆蓋繞過
等等還有更多的姿勢