Java審計之XSS篇

nice_0e3發表於2020-09-12

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審計都是自己琢磨,結合一下網上的文章,復現一下,很快就熟悉了。

相關文章