Java審計之XSS篇

Java審計之XSS篇

0x00 前言

繼續 學習一波Java審計的XSS漏洞的產生過程和代碼。javascript

0x01 Java 中XSS漏洞代碼分析

xss原理

xss產生過程:php

後臺未對用戶輸入進行檢查或過濾,直接把用戶輸入返回至前端。致使javascript代碼在客戶端任意執行。

XSS代碼分析

在php裏面會使用echo對用戶輸入的參數進行直接輸出,致使了xss漏洞的產生。而在Java裏面會將接收到的未通過濾的參數共享到request域中,在jsp的頁面裏面使用EL表達式進行輸出。html

這裏編寫一個serlvet來作一個演示前端

xssservlet代碼:java

@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代碼:web

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    ${requestScope.content}
</head>
<body>

</body>
</html>

啓動tomcat,訪問url:ajax

http://localhost:8080/untitled3_war_exploded/demo?content=1

傳參一個1過去成功輸入了,那麼再來傳一個xss的payload試試。數據庫

http://localhost:8080/untitled3_war_exploded/demo?content=<script>alert("xss")</script>

成功的彈出了一個框api

在審計中須要關注的是參數是否可控,若是可控傳入的參數是否會被過濾後共享到request域中,若是在可控和不被過濾的狀況下,就頗有可能存在xss漏洞。tomcat

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

相關文章
相關標籤/搜索