日常工作過程中,偶然發現一個網站登入頁面,在頁面返回包中存在一個隱藏引數“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隱碼攻擊被攔截時,使用引數汙染方式嘗試繞過,可能會有奇效。