Java出现的XSS经典代码出现的地方
1、使用EL表达式映射
String content = request.getParameter(“content”)
request.setAttribute(“content”, content)
例如${requestScope.content}
2、ModelAndView
@RequestMapping("/xss")
public ModelAndView xss(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
String name = request.getParameter("name");
ModelAndView mav = new ModelAndView("mmc");
mav.getModel().put("uname", name);
return mav;
}
直接传入一个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()方法获取请求参数的地方停止。
关键的点还是在于值得获取返回
而至于取值的地方就是使用getString从数据库里取值,然后setName到msg参数里
而在message.jsp里就是直接通过request.getAttribute获取到msg,然后直接在JSP里打印出来,被浏览器直接解析了。
主要的关键点还是和反射型的差不多,仅仅是多了两步步骤:1、传入参数放到数据库,2、从数据库直接取值。
5、简单的jsp
传入参数,然后直接 out.println()打印出来,那么就是一个最简单的xss
<% out.println(request.getParameter(‘id’)); %>
6、XSS的绕过
值得注意是的,在很多小众的产品都会存在XSSFilter,大部分都是过滤了script,img,alert比较常见的,但是也不要忽视可能存在XSS风险,只要传入代码没有被进行完全的实体化或转义,那么就可以尝试冷门的标签进行绕过。例如