跨網站指令碼(Cross-Site Script; XSS)攻擊是在網路上常見的攻擊手法,
針對網頁在開發時尚未注意到的漏洞,透過植入惡意的代碼來進行攻擊,
最常見的方式是使用JavaScript語法來進行攻擊。
範例如下:
在畫面上拉一個Textbox及Button
<html> <head></head> <body> <form id="form1" runat="server"> <div> <asp:TextBox ID="Test1_txt" runat="server" Width="300"><asp:TextBox> <br /><br /> <asp:Button ID="Send_Btn" runat="server" Text="Send" OnClick="Send_Btn_Click" /> <asp:Label ID="Display_lbl" runat="server" Text=""><asp:Label> </div> </form> </body> </html>
在Textbox裡填上攻擊的語法,
按下Button送出後,Script 會被轉換成網頁上的HTML碼,
而當Html Render到那行Script時,則會被執行,
如下圖,alert語法被執行後彈出視窗,
在撰寫這段程式碼時,筆者發現Chrome及Firefox執行時,
會自動過濾是否為XSS攻擊,若發現是XSS攻擊則而不執行,
【解法】
1. ASP.NET 本身有提供防範XSS的機制,於Web.config中加上
<pages validateRequest="true"></pages>
此行後,會自動對送出的表單進行驗證,若有輸入XSS攻擊語法時,會跳出錯誤訊息,
如下圖
2. 採用微軟提供的AntiXSSLibrary方式來做避免XSS攻擊
可先於Nuget中安裝AntiXSS,
安裝完成後會自動於參考加入AntiXSSLibrary.dll
並於程式碼參考中加入using Microsoft.Security.Application
在需要進行編碼的地方加入Encoder.HtmlEncode
protected void Send_Btn_Click(object sender, EventArgs e) { Display_lbl.Text=Encoder.HtmlEncode(Test1_Txt.Text); }
執行修改過後的網頁,可看出User輸入的值已正常被呈現在網頁上,
而非彈跳出視窗了,
原因為Encoder.HTMLEncode將輸入的值先編碼過,
而瀏覽器在執行時會做解碼,
因此輸入的值則會被視為文字型態來執行。
參考資訊:
gipi的學習筆記-專案管理、商務簡報技巧部落格
Wiki
Web安全測試之XSS
0 意見:
張貼留言