前言
最近同事詢問一個 ODataController 被黑箱打到的一個 XSS 問題。
ODataController 允許我們使用 $count, $select 等操作。
我們用一個簡單的 webapi 專案來測試,新增 WebApi 專案後,加入「Microsoft.AspNet.OData」。
詳細可以參考 Create an OData v4 Endpoint Using ASP.NET Web API。
測試
建立 Product Model ,
1 | public class Product |
因為只要測試 odata ,所以在 WebApiConfig.cs 只需設定 OData 的部份,如下,
1 | public static class WebApiConfig |
建立測試的 ODataController
1 | public class ProductsController : ODataController |
所以執行出來的結果如下,
1 | http://localhost:50758/odata/Products?$count=true |
正常的 $count 的值允許為 true/false。
但是黑箱卻給它輸入以下的值,
1 | $count=<ScRiPt>cXfm(9342)</ScRiPt> |
因為直接把 url 上的內容直接輸出了,所以就被黑箱說有 XSS 問題。
解法
從上面可以發現,雖然它有錯誤的訊息出來,但程式卻會正常執行到 OK。
只是在 ODataQueryOptions
即然沒有錯誤,那要在那裡去將錯誤訊息 Encode 呢?
我們可以透過 opts.ApplyTo 去驗證它們,如果有錯誤的話,就建立 ODataException ,並將訊息 Encode ,如下,
1 | [ ] |
所以再執行一次,就可以發現錯誤訊息都有被 Encode 了。