繼續 學習一波Java審計的XSS漏洞的產生過程和代碼。javascript
xss產生過程:php
後臺未對用戶輸入進行檢查或過濾,直接把用戶輸入返回至前端。致使javascript代碼在客戶端任意執行。
在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漏洞的攻擊,就須要添加一個方法,在傳入前先調用該方法進行一次過濾,可是這樣的方式比較繁瑣,這時候就可使用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
此次仍是拿上次搭建的環境來作一個演示。
那麼結合前面的內容,知道了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>
訪問一下漏洞地址
這裏還須要登陸後才能訪問,那就登陸一下吧!
系統錯誤,我。。。。。確定又是上次那張表的問題,那幾張表沒創建好。
算了,洗洗睡吧!!!
Java的xss審計都是本身琢磨,結合一下網上的文章,復現一下,很快就熟悉了。