服務器兩層架構
服務器端有兩個部分:第一部分爲tomcat爲引擎的jsp型服務器,第二部分爲apache爲引擎的php服務器,真正提供web服務器的是php服務器。工作流程爲:client訪問服務器能直接訪問到tomcat服務器,然後tomcat服務器再向apache服務器請求數據。
HTTP參數處理
在與服務器進行交互的過程中,客戶端往往會在GET/POST請求中帶上參數。通常在一個請求中,同名參數只會出現一次,但是在HTTP協議中是允許同名參數多次出現的。
以上圖服務器爲例假設請求爲index.php?id=1&id=2,客戶端請求首先通過tomcat解析第一個參數,接下來tomcat去請求apache服務器,而apache解析最後一個參數。實際提供服務的是apache服務器,因此返回客戶端的是id=2。
下表爲數服務器對參數解析的:
web服務器 | 參數獲取函數 | 獲取到的參數 |
---|---|---|
PHP/Apache | $_GET(“par”) | Last |
JSP/Tmocat | Request.getParameter(“par”) | First |
Perl(CGI)/Apache | Param(“par”) | First |
Python/Apache | getvalue(“par”) | All(List) |
ASP/IIS | Request.QueryString(“par”) | All(comma-delimited string) |
HTTP參數污染
如果一個網站只在tomcat服務器處做數據過濾和處理,我們可以利用解析參數的不同,對WAF檢測進行繞過。
攻擊payload:index.php?id=-1' union select 1,database(),3--+
union select…會被tomcat服務器識別爲惡意攻擊並攔截,而如果payload如下:
攻擊payload:index.php?id=1&id=-1' union select 1,database(),3--+
n select 1,database(),3–+```
tomcat服務器檢測第一個參數後發現無異常,提交給apache服務器。成功繞過WAF攔截