java代码审计-XSS
0x01 前言
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript。xss本质上就是浏览器执行了域外的代码,出现的场景比较多,需要具体情况具体分析
0x02 反射型xss
@RequestMapping("/reflect")
@ResponseBody
public static String reflect(String xss) {
return xss;
}
可以看到代码中设定参数值没有经过任何过滤访问直接返回到页面中
payload:xss=<script>alert(/xss/)</script>
0x03 存储型xss
存储型xss就是把我们嵌入的js代码存储到数据中,然后通过访问数据库的功能点然后造成xss,所以它相比反射型xss更持久危害更大
@RequestMapping("/stored/store")
@ResponseBody
public String store(String xss, HttpServletResponse response) {
Cookie cookie = new Cookie("xss", xss);
response.addCookie(cookie);
return "Set param into cookie";
}
这里用cookie来模拟下存储型xss,设定一个参数值把它写到cookie中,然后我们再通过以下路由去取这个值然后返回到页面中来
@RequestMapping("/stored/show")
@ResponseBody
public String show(@CookieValue("xss") String xss) {
return xss;
}
payload:http://localhost/xss/stored/store?xss=%3Cscript%3Ealert(/xss/)%3C/script%3E
访问路由/stored/show,触发xss
0x04 漏洞修复
自定义函数,过滤<>
等敏感字符
@RequestMapping("/safe")
@ResponseBody
public static String safe(String xss) {
return encode(xss);
}
private static String encode(String origin) {
origin = StringUtils.replace(origin, "&", "&");
origin = StringUtils.replace(origin, "<", "<");
origin = StringUtils.replace(origin, ">", ">");
origin = StringUtils.replace(origin, "\"", """);
origin = StringUtils.replace(origin, "'", "'");
origin = StringUtils.replace(origin, "/", "/");
return origin;
}
0x05 其它
xss的利用手段主要是网络蠕虫攻击和窃取用户cookie信息。xss蠕虫通过漏洞点嵌入恶意的js代码,执行代码后,就会添加带有恶意代码的页面或DOM元素,从而进行传播。而如果盗取cookie信息,常见的就是进行跨域请求的问题。