參考:php
HPP,簡而言之,就是給參數賦上多個值。html
好比: https://www.baidu.com/s?wd=asdqwe&wd=http參數污染
百度究竟會給出有關 asdqwe 的相關信息,仍是 http參數污染 的相關信息,仍是二者兼併?事實證實,百度只取第一個關鍵詞 asdqwe
,不一樣的服務器架構會取不一樣的值web
緣由:因爲現行的HTTP標準沒有說起在遇到多個輸入值給相同的參數賦值時應該怎樣處理,並且不一樣的網站後端作出的處理方式是不一樣的,從而形成解析錯誤chrome
下面是不一樣服務端所處理的方式django
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 都有flask
用處:後端
任意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框架:app
框架 | 取值 |
---|---|
flask | First |
django | Last |
方式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