Java出现的XSS经典代码出现的地方

1、使用EL表达式映射

String content = request.getParameter(“content”)
request.setAttribute(“content”, content)
例如${requestScope.content}

2、ModelAndView

  1. @RequestMapping("/xss")
  2. public ModelAndView xss(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
  3. String name = request.getParameter("name");
  4. ModelAndView mav = new ModelAndView("mmc");
  5. mav.getModel().put("uname", name);
  6. return mav;
  7. }

直接传入一个name参数,并且使用springMVC里的ModelAndView来返回指定的页面
这里getModel().put(“uname”,name)类似于request.setAttribute(“content”, content)
或者是用mav.addObject(“uname”, name);这个也可以

具体modelAndView可看这里https://blog.csdn.net/qq_41648616/article/details/81776145

3、Servlet的getWriter

String message = req.getParameter(“msg”);
resp.getWriter().print(message );
直接将msg的参数通过response写到了返回页面中,没有任何花里胡哨的东西。

4、存储型XSS

存储型XSS通常都会伴随有SQL语句的写入
一般来说:
全局搜索数据库的插入语句(关键词:insert,save,update),然后找到该插入语句所属的方 法名如(insertUser()),然后全局搜索该方法在哪里被调用,一层层的跟踪。直到 getParamter()方法获取请求参数的地方停止。

关键的点还是在于值得获取返回
image.png
而至于取值的地方就是使用getString从数据库里取值,然后setName到msg参数里
image.png
而在message.jsp里就是直接通过request.getAttribute获取到msg,然后直接在JSP里打印出来,被浏览器直接解析了。
image.png
主要的关键点还是和反射型的差不多,仅仅是多了两步步骤:1、传入参数放到数据库,2、从数据库直接取值。

5、简单的jsp

传入参数,然后直接 out.println()打印出来,那么就是一个最简单的xss
<% out.println(request.getParameter(‘id’)); %>

6、XSS的绕过

值得注意是的,在很多小众的产品都会存在XSSFilter,大部分都是过滤了script,img,alert比较常见的,但是也不要忽视可能存在XSS风险,只要传入代码没有被进行完全的实体化或转义,那么就可以尝试冷门的标签进行绕过。例如

防御手段

1、ESAPI——ESAPI.encoder().encodeForJavaScript
2、commons-lang-2.5.jar-StringEscapeUtils
3、google的第三方Java库xssProtect
4、org.springframework.web.util.HtmlUtils
5、写一个全局的xssfilter

  1. 这⾥要注意的是,我们的配置是 /* ⽽不是 /
  2. < url-pattern>/</url-pattern> 会匹配到 /login
  3. 但是不会匹配到模式为 *.jsp 这样的后缀型url,
  4. ⽽< url-pattern>/*</url-pattern> 会匹配所有url
  5. 路径型的和后缀型的url(包括 /login , *.jsp , *.js 和 *.html

https://xz.aliyun.com/t/8294