Java審計之XSS篇
0x00 前言
繼續 學習一波Java審計的XSS漏洞的產生過程和程式碼。
0x01 Java 中XSS漏洞程式碼分析
xss原理
xss產生過程:
後臺未對使用者輸入進行檢查或過濾,直接把使用者輸入返回至前端。導致javascript程式碼在客戶端任意執行。
XSS程式碼分析
在php裡面會使用echo
對使用者輸入的引數進行直接輸出,導致了xss漏洞的產生。而在Java裡面會將接收到的未經過濾的引數共享到request域中,在jsp的頁面裡面使用EL表示式進行輸出。
這裡編寫一個serlvet來做一個演示
xssservlet程式碼:
@WebServlet("/demo")
public class xssServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");// 設定響應型別
String content = request.getParameter("content"); //獲取content傳引數據
request.setAttribute("content", content); //content共享到request域
request.getRequestDispatcher("/WEB-INF/pages/xss.jsp").forward(request, response); //轉發到xxs.jsp頁面中
}
}
xss.jsp程式碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
${requestScope.content}
</head>
<body>
</body>
</html>
啟動tomcat,訪問url:
http://localhost:8080/untitled3_war_exploded/demo?content=1
傳參一個1過去成功輸入了,那麼再來傳一個xss的payload試試。
http://localhost:8080/untitled3_war_exploded/demo?content=<script>alert("xss")</script>
成功的彈出了一個框
在審計中需要關注的是引數是否可控,如果可控傳入的引數是否會被過濾後共享到request域中,如果在可控和不被過濾的情況下,就很有可能存在xss漏洞。
防禦xss策略
我們需要防禦xss漏洞的攻擊,就需要新增一個方法,在傳入前先呼叫該方法進行一次過濾,但是這樣的方式比較繁瑣,這時候就可以使用ESAPI來幫我們過濾。
ESAPI介紹:
企業安全API(ESAPI)專案是OWASP專案,可為每個Web平臺建立簡單的強大安全控制元件。安全控制元件並不容易構建。您可以在OWASP網站上了解無聊的開發人員的數百個陷阱。通過為開發人員提供一組強大的控制元件,我們旨在消除建立安全Web應用程式的某些複雜性。這可以在整個SDLC中節省大量成本。
據說可以應付大部分的web攻擊漏洞。
在pom.xml匯入ESAPI座標
<!-- https://mvnrepository.com/artifact/org.owasp.esapi/esapi -->
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.2.1.1</version>
</dependency>
servlet程式碼:
@WebServlet("/demo")
class xssServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ServletException, IOException {
response.setContentType("text/html");// 設定響應型別
String content = request.getParameter("content"); //獲取content傳引數據
String s = ESAPI.encoder().encodeForJavaScript(content); //進行實體編碼
request.setAttribute("content", s); //content共享到request域
request.getRequestDispatcher("/WEB-INF/pages/xss.jsp").forward(request, response); //轉發到xxs.jsp頁面中
}
}
參考該部落格
https://blog.csdn.net/CHS007chs/article/details/86645450
0x02 CMS 審計
這次還是拿上次搭建的環境來做一個演示。
那麼結合前面的內容,知道了xss的產生過程是使用request.setAttribute方法將請求到的資料未經過濾儲存到request域中,然後在jsp頁面裡使用el表示式進行輸出。
在審計的時候我們可以直接來全域性搜尋 快捷鍵 `Ctrl+Shift+F
這裡就來找一下儲存型xss,反射的xss意義並不大。
點選選擇一個檔案來看看他的程式碼,這裡直接就給共享到request域中了,但是這裡只是我們的一個查詢方法,我們需要找到他輸入值的地方, 看到下面的addComment方法正好對應上了一個輸出xss ,一個插入xss的地方。
檢視該方法 commentService.addComment(comment);
呼叫addComment方法將值傳入,不出意外的話傳入的comment引數就是接收過來的一個實體類。我們來Ctrl+左鍵點選 Comment類進行跳轉到該類去。
主要關注變數為 String型別的變數,因為Java是強型別的語言。
等會對這幾個變數的地方進行插入xss程式碼。
回到剛才的控制器程式碼
點選ctrl+左鍵點選addComment 追溯到CommentService 的介面
同樣的方式再追溯到CommentService的實現類
使用的是commentDao呼叫addComment 傳入引數進行新增資料。繼續追溯上去
在這裡我們就看到了dao介面中的addcomment方法,dao介面中並沒有myabtis的註解,說明是xml配置檔案配置的。
後面的直接開啟全域性搜尋,搜尋addComment指定xml檔案。
點選進去看到,我們的提交的內容會被插入資料庫裡面,也就是說這是個儲存型xss
邏輯這裡其實已經很清晰了。
具體的還得看實操,檢視Controller獲取路徑。
漏洞位置:
http://127.0.0.1:82/web/comment/ajax/addcomment
結合剛剛檢視的Comment實體類,我們已經找到哪些地方可以去插xss了。
<script>alert("1")</script>
訪問一下漏洞地址
這裡還需要登入後才能訪問,那就登入一下吧!
系統錯誤,我。。。。。肯定又是上次那張表的問題,那幾張表沒建立好。
算了,洗洗睡吧!!!
0x03 結尾
Java的xss審計都是自己琢磨,結合一下網上的文章,復現一下,很快就熟悉了。