最近我在處理一個低風險安全問題「查詢中接受了 Body 參數」(如下圖,網址我修改掉了,避免不必要的麻煩)
一開始看了對方的報告書中的修補建議「重新撰寫應用程式,禁止處理查詢中列出的 POST 參數」,我看了真的很無言,系統都上線了,要我重新撰寫應用程式….怎麼可能…後來我查了一下資料,這個問題用英文「body parameters accepted in query」比較好找到解答。
簡單來說AppScan在掃描的過程中,如果網頁是用POST傳參數,AppScan會試著使用GET然後在URL後面帶原本POST的參數丟過去,看回傳結果會不會一樣,如果結果類似,AppScan就會判定該網頁為「查詢中接受了 Body 參數」低風險。
既然知道它的掃描原理,要處理就很簡單了,如果是利用POST傳參數,那就用POST的方式來接參數,如果是利用URL的方式傳參數,那就用GET的方式來接參數。
在ASP.NET裡POST取參數要用Request.Form,例如:
string type = Request.Form[“type”];
GET取參數要用Request.QueryString:
string type = Request.QueryString[“type”];
以前寫程式都很偷懶都是直接寫Request[“type”],這個寫法ASP.NET會同時去GET或POST找參數看有沒有存在,現在改用上面的寫法就不會被檢測出「查詢中接受了 Body 參數」問題了。
但是!!!!!! 我哪有這麼多美國時間一個一個去修改,當然是找一個通用的方式來做啊。由於我的Aspx頁面都會繼承一個BasePage.cs,所以我直接在這裡面加了一個虛擬方法,子頁面再自己選擇要不要實作。
然後在BasePage.cs加入一段檢查流程,如果子頁面選擇實作onlyAcceptHttpPost Method,然後回傳true,在檢查流程裡面就會檢查是不是用GET方式呼叫該頁面(如下圖),true就導向到我設計好的403.aspx頁面進行訊息顯示。
可能有人會覺得用method(onlyAcceptHttpPost)來做參數設計不是好設計,這是系統架構的問題,就不再本次討論範圍內了。