資安JAVA(二二): HTTP Parameter Pollution

來源:John Melton's Weblog
標題:YEAR OF SECURITY FOR JAVA – WEEK 22 – HTTP PARAMETER POLLUTION
作者:John Melton

What is it and why should I care?

HTTP 參數汙染是一種自訂字串語句然後複寫 HTTP GET/POST 參數的注入技術。2009年的一篇 文章 提出這個名詞後,逐漸普及。只要你能發揮創意填補HTTP的參數,多次送出相同的參數,就有機會造成WEB應用程式出乎意料的反應。如果有人利用這個request
/mypage.jsp?query=abc&acct=4
改成這樣,會發生什麼事呢?
/mypage.jsp?query=abc&acct=5&acct=4

當你呼叫 request.getParameter("acct") 會得到什麼值?不同的 server 會有不同的反應,還好,這裡有一份 PPT 可以讓你參考各家 server 的反應。JAVA 的朋友們,你通常會得到相同參數的第一個值─也就是 request.getParameter("acct") = "5"。

所以勒?有這麼嚴重嗎?是的,這個弱點會產生複寫參數、修改行為、存取變數、繞過輸入驗證等等的漏洞。

作者認為這和HTTP 路徑參數問題(Http Path Parameter Issue) 很像,共同點是你可以自訂授權檢查的 URL 後面的參數,然後 request 到不一樣的值。上面的例子進行授權檢查時,"acct" 變數可能得到 "4" ,然後使用者將被認定是 acct=4 的身分。然而,實際上你的資料庫收到的 request.getParameter("acct") 卻是帳號 "5" ,所以使用者 "4" 就可以繞過授權檢查存取使用者 "5" 的資料。


What should I do about it?

記住四個重點就能幫助你改善 HPP 問題。

1. 環境警覺心 Awareness
了解你所使用的環境,了解你所使用的Server ,了解 HPP 怎麼處理。

2. 一致性 Consistency
保持處理參數的一致性。假使你需要重複存取某個參數,確保每一次存取都經過同樣的程序。不要一邊手動解析( parse ) URL ,另一邊又用 request.getParameter() 。

3. 驗證數入值 Validate Input
最常用的方法之一就是編碼,多加利用標準化URL和驗證,務必確認輸入值的格式符合預期。如果你不知道怎麼作,可以多加利用 OWASP ESAPI 框架。

4. 偵測已知攻擊 Detect known attacks
你可以利用 OWASP AppSensor 分析攻擊者如何利用這個漏洞攻擊你。假使應用程式中的 request.getParameterValues(“acct”) 得到的值並不是整數 "1" ,代表兩種可能 
   a. 程式有bug。
   b. 有人在玩弄你的程式。
接著持續追蹤類似事件,並記錄何時發生入侵行為,這才能幫助你第一時間挺身面對攻擊者。

HPP 是一般人不知道的、很有趣的技巧。只要你稍微思考一下,很容易就能避免。希望本篇文章能幫助你。

(作者註:以上範例不適用於複選方塊控制項,因為多重複選方塊的值會直接回傳0。)

以下影片是示範如何透過HPP在舊版YAHOO信箱執行刪除所有郵件的指令。

參考資料
HTTP Parameter Pollution (HPP)
OWASP HTTP 參數汙染介紹 PPT
小心HTTP路徑參數問題
OWASP 企業安全 API
https://www.owasp.org/index.php/OWASP_AppSensor_Project
———–———–

資安Java: 上一篇 || 下一篇
———–———–

留言

這個網誌中的熱門文章

資安JAVA(十):X-Content-Type-Options

資安JAVA(十一):X-XSS-Protection

資安JAVA(四):Session Cookie HTTPOnly Flag