继续 学习一波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审计都是本身琢磨,结合一下网上的文章,复现一下,很快就熟悉了。