Java程式碼審計匯總系列(七)——XSS
- 2019 年 12 月 9 日
- 筆記

一、概述
xss漏洞是指對於和後端有交互的地方沒有做參數的接收和輸入輸出過濾,導致惡意攻擊者可以插入一些惡意的js語句來獲取應用的敏感資訊,黑盒系列可見:瀏覽器解析與編碼順序及xss挖掘繞過全匯總。
大多數通過白盒發現的xss通常發生在將用戶輸入拼接構造頁面元素,或直接輸出在前端頁面中。
二、挖掘技巧
xss分為反射型,存儲型和DOM型,挖掘的思路類似,注意前端構造的參數(元素或值)是否用戶可控。
但白盒挖掘xss不像之前的漏洞有明顯的漏洞特徵和危險函數,需要根據實際情況審計前端js、jsp、html文件。用戶輸入處用的比較多的是request.getParameter(param)、${param}直接獲取用戶輸入,當然也有其他輸入源,需根據程式碼實際情況分析判斷。
類似如下案例,直接將內容返回到前台的頁面上,追蹤courseName,其值取自資料庫,用戶可控:

三、漏洞防禦
xss的防禦辦法較多且較為簡單:
1、全局編寫過濾器;
xml配置文件中定義過濾類或自寫過濾類:
private String cleanXSS(String value) { //You'll need to remove thespaces from the html entities below value = value.replaceAll("<", "<").replaceAll(">", "& gt;"); value = value.replaceAll("\(","& #40;").replaceAll("\)", "& #41;"); value = value.replaceAll("'", "& #39;"); value = value.replaceAll("eval\((.*)\)", ""); value =value.replaceAll("[\"\'][\s]*javascript:(.*)[\"\']",""""); value = value.replaceAll("script", ""); return value;
2、調用第三方包
添加jar包:commons-lang-2.5.jar ,在後台調用函數:
StringEscapeUtils.escapeHtml(string); StringEscapeUtils.escapeJavaScript(string); StringEscapeUtils.escapeSql(string);
3、HTML轉義輸出
org.springframework.web.util.HtmlUtils 可以實現HTML標籤及轉義字元之間的轉換。
String string =HtmlUtils.htmlEscape(userinput); //轉義 String s2 =HtmlUtils.htmlUnescape(string); //恢復
四、實戰案例
1、DOM XSS
審計js文件發現DOM渲染,經典的將用戶輸入拼接生成HTML程式碼或script標籤中,這是在白盒測試中最常見的xss場景:
function search (){ varinputStr = $_ts("#search_input").val(); if(inputStr.length> 0){ varsearchurl = ""+url+"/search?keyword="+inputStr +"&lang=zh"; varsearchLink = '<a id="temp_search_link" target="_blank"rel="noopener " href="' + searchurl + '"style="display:none;"><span id="searchclick"></span></a>'; $_ts("body").append(searchLink); $_ts("#searchclick").click(); $_ts("#temp_search_link").remove(); }
2、Cookie XSS
同樣是審計js文件,在文件中發現如下程式碼,:
document.write('<linkhref="resource/web/css/page.css" type="text/css"rel="stylesheet" />'); varlocale = getCookie("locale"); varCssPath = "resource /web/theme /default/css/base_" + locale +".css"; document.write('<linkhref="' + CssPath + '" type="text/css"rel="stylesheet" />');
將經過getCookie方法的值locale進行拼接,用document.write 輸出到頁面,跟進getCookie:
function getCookie(name) { vararr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)"); if(arr = document.cookie.match(reg)) returnunescape(arr[2]);
將cookie變數值locale與目錄進行拼接,用document.write 輸出到頁面,未檢查特殊字元,可在前端偽造cookie進行攻擊。
另外,挖掘DOM xss可關注location.*、document.*、window.*等關鍵字。
3、 過濾繞過
審計jsp文件,param為用戶輸入參數,

然後在js文件中的exportStep2Host函數中進行賦值,在後 URL解碼後傳給form表單的action屬性,然後再提交表單。這個函數會在頁面被打開的時候觸發。

但在取用戶輸入時經過了validateQuotAndBracketChar過濾,跟進分析此工具類:

這個類對用戶輸入進行了黑名單限制,不能包含<>』」以及對字元url編碼的%3E、%3C等字元。可使用javascript協議進行url編碼繞過:
javaScript%3a%3ba%25%36%63ert%601%60
最終payload:
https://url/path/exportStep2Host.jsp?param=javaScript%3a%3ba%256cert`1`
所以能用白名單盡量用白名單,若使用黑名單盡量全面。