2011-08-12 66 views
2

我的公司向我提供瞭解決特定應用程序的所有安全問題的任務。安全流程報告了一個跨站點腳本錯誤。錯誤主要表現在以下輸入字段:使用隱藏輸入的跨站點腳本

<input type="hidden" name="eventId" value="${param.eventId}"/> 

從安全問題的報告是不是很詳細,但說他們可以做一個POST請求具有上述標籤包含以下惡意代碼的網頁:

eventId=%22%3e%3csCrIpT%3ealert(83676)%3c%2fsCrIpT%3e 

而且,當頁面重新加載,它將具備以下條件:

<input type="hidden" name="eventId" value=""><sCrIpt>alert(83676)</sCrIpt></value> 

我試圖要「黑客」,並顯示該漏洞。但我無法弄清楚他們如何設法在那裏獲得該腳本。我猜測他們將它作爲一個URL參數包含在表單的GET請求中,但是當我嘗試自己做這件事時,我得到一個403錯誤。有誰知道如何顯示漏洞?

我知道網站上有很多XSS的問題,但沒有一篇似乎打這個話題。

+0

如何您是否將其添加到網址?哪裏有其他參數? – Erlend

回答

3

所以,我不知道爲什麼,但我最初的預感是正確的。腳本可以作爲URL參數放置。不過出於某種原因,這不適用於我們的分期網站。只能在本地運行應用程序。我不知道爲什麼,但這個工作(只在本地):

http://localhost:8080/myUrl/MyAction.do?eventId=%22%3e%3csCrIpT%3ealert(83676)%3c%2fsCrIpT%3e 

這樣做,你會看到一個警告框彈出。我打算使用JSTL函數來修復它。

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 
... 
<input type="hidden" name="eventId" value="${fn:escapeXml(param.eventId)}"/> 
0

想要解決問題的方法是在將值放入值屬性之前對HTMLAttributeEncode進行編碼。有關執行HTML屬性編碼的方法,請參閱OWASP ESAPI或MS AntiXSS。 看到攻擊字符串是如何進行URL編碼的,我想你猜想把它作爲一個GET參數看起來是合理的。

1

在firefox瀏覽器中安裝[TamperData][1]附加組件,讓您在提交前編輯數據。如果它處於POST或GET,則無關緊要。使用此hidden fields可以是edited

0

我使用了OWASP ESAPI API,因爲傳統的jsp沒有JSTL可用。這是我用什麼:

<input type="hidden" name="dataValue" value="<%=ESAPI.encoder().encodeForHTMLAttribute(dataValue)%>"> 

您也可以使用API​​來過濾request.Parameter(),我也需要,如:

String userURL = request.getParameter("userURL") 
boolean isValidURL = ESAPI.validator().isValidInput("URLContext", userURL, "URL", 255, false); 
if (isValidURL) { 
    <a href="<%=encoder.encodeForHTMLAttribute(userURL)%>">link</a> 
} 

和:

String name = (String) request.getParameter("name"); 
name = ESAPI.validator().getValidInput("name ", name , "SafeString", 35, true);