日常工作過程中,偶然發現一個網站登錄頁面,在頁面返回包中存在一個隱藏參數“mess”,且該頁面部署了百度RASP進行防護,本文介紹如何發現隱藏參數以及如何通過參數污染方式造成XSS攻擊。涉及信息較為敏感,請各位看官見諒。
一、參數污染
HTTP參數污染,也叫HPP(HTTP Parameter Pollution)。當給一個參數賦兩個值或者更多的值時,服務器對多次賦值參數的數據處理也是不同的,根據這個特征,可以對某些防護設備進行繞過。
如下:
url:http://example.com/search.php?id=666&id=999
服務端接收到id參數后會對id進行解析。
谷歌處理如下:
兩個值都進行了選擇
百度如下:
只有第一個值被選擇,第二個值沒有被選擇。
雅虎如下:
第二個p值被選擇。
故我們可以利用這個特征,對某些防護設備進行嘗試繞過。
二、隱藏參數
登錄頁面隨意輸入信息后進行抓包,返回包如下:
在返回包中搜索“hidden”,發現參數“mess”。
在請求包內添加“mess”參數進行測試
請求包:
返回包:
三、嘗試繞過百度RASP
百度RASP:OpenRASP 拋棄了傳統防火牆依賴請求特征檢測攻擊的模式,創造性的使用RASP技術(應用運行時自我保護),直接注入到被保護應用的服務中提供函數級別的實時防護,可以在不更新策略以及不升級被保護應用代碼的情況下檢測/防護未知漏洞,尤其適合大量使用開源組件的互聯網應用以及使用第三方集成商開發的金融類應用,詳細介紹可自行搜索官方文檔。
嘗試常規XSS payload被攔截
經測試使用常規XSS payload均被RASP攔截
使用參數污染進行繞過:
Step1:
嘗試輸入兩個”mess”參數,確認可被服務端接收的值
請求包:
返回包: 1和2都被接收,但在1結束處出現了“,”
Step2:
對前面的語句進行閉合:
請求包:
返回包:
Step3:
嘗試構造常規XSS payload
請求包:
返回包:
此時出現了一個問題,在每次參數賦值后,都會出現“,”且“,”的出現是無法避免的,因此我們需要構造一個payload,使其能夠合理的存在“,”,在這兒使用定義參數來進行構造,將“,”合理的包含在payload中。
第一個“,”定義var a,b=alert(1) #在<script>后增加var a,把賦值出現的“,”當做對a和b參數定義的間隔。
第二個“,”在alert(1)后面再次賦值c=1</script> #將alert(1)后出現的“,”包含在payload當中,使</script>前面緊跟的是c=1而不是“,”
最終這個payload可以寫成:<script>var a,b=alert(1),c=1</script>
本地測試:
那么請求包內可以寫成:mess=”>&<script>var a&mess=b=alert(1)&mess=c=1</script>
Step4:
最終成功彈窗
四:總結
本文從尋找隱藏參數到常規payload被RASP攔截,再到參數污染方式進行繞過並處理多值接收的“,”問題,最終構造出了可成功執行的payload。文章中涉及漏洞實際風險有限,但可當做一個參數污染繞過防護設備的典型案例,在之后遇到XSS或者SQL注入被攔截時,使用參數污染方式嘗試繞過,可能會有奇效。