HTTP參數污染 --- HPP
參考:
HPP,簡而言之,就是給參數賦上多個值。
比如: https://www.baidu.com/s?wd=asdqwe&wd=http參數污染
百度究竟會給出有關 asdqwe 的相關信息,還是 http參數污染 的相關信息,還是兩者兼並?事實證明,百度只取第一個關鍵詞 asdqwe,不同的服務器架構會取不同的值
原因:由於現行的HTTP標准沒有提及在遇到多個輸入值給相同的參數賦值時應該怎樣處理,而且不同的網站后端做出的處理方式是不同的,從而造成解析錯誤
下面是不同服務端所處理的方式
| Web服務器 | 參數獲取函數 | 獲取到的參數 |
|---|---|---|
| PHP/Apache | $_GET(“par”) | Last |
| JSP/Tomcat | 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) |
推薦一個自動識別前后端框架的插件 wappalyzer,chrome、firefox、edge 都有
用處:
- 邏輯漏洞:
-
任意URL跳轉
例如:
www.famous.website?ret_url=subdomain.famous.website,由於后端做了限制,當我們把 ret_url 改成別的不同源的域名(如baidu.com)時會報錯
但是我們可以利用HPP,將請求地址變成www.famous.website?ret_url=subdomain.famous.website&ret_url=baidu.com時,由於服務器邏輯錯誤
使用第一個 ret_url 做校驗參數,而第二個 ret_url 參數做跳轉目的地址。於是這樣便可成功繞過限制,形成任意 URL 跳轉 -
任意密碼重置(短信爆破)
一般重置密碼的時候,會發送短信到用戶手機
比如GET/POST傳遞的參數為:phone=13888888888
我們一般會去想,能不能發送驗證碼到自己的手機,於是可以構造成:phone=13888888888,12345678901或者phone=13888888888;12345678901或者phone={13888888888,12345678901}
等等一些情況,有時候能通過,但是有些時候會出現 號碼不合法 的情況,此時便可以考慮利用 HPP ——phone=13888888888&phone=12345678901,如果恰好服務器用第一個號碼驗證是否存在該用戶,而使用第二個號碼發送短信時,我們便可以接管該用戶
- 繞過 WAF
原理:當 WAF 檢測端與服務器端webapp使用的參數不一致時,便可繞過 WAF 限制
WAF框架:
| 框架 | 取值 |
|---|---|
| flask | First |
| django | Last |
- SQL注入繞過
方式1:
例如:WAF 端采用 flask 框架而服務器 webapp 端采用 PHP/Apache 框架時,由於 WAF 取第一個參數,app 取第二個參數,利用 HPP 便可繞過 WAF 檢測
www.xxx.com/search.php?id=1&id=7 union select 1,2,database()
方式2:
例如:WAF 端只檢測單個參數,而服務器 webapp 端會將所有參數合並起來檢測
www.xxx.com/search.php?id=1&id=%20union%20&id=select%201,2&id=,database() 利用拼接的方式繞過 WAF
- XSS
跟 SQL 注入相似,檢測過濾與實際采納的參數不一致
可能有 HPP 的地方
- 很多可能存在越權漏洞的地方,當做了權限驗證時,可以試一試提交多個參數
- 繞 WAF 的時候
