java-sec-code
用于学习java漏洞代码
环境部署
直接在idea中使用git 运行即可
@RequestMapping("/reflect")
@ResponseBody
public static String reflect(String xss) {return xss;}
当用户访问到/reflect
URL地址时,程序会自动调用reflect
方法,该方法定义了一个名为xss
的字符串参数,当用户发送一个请求到"/reflect
" URL并带有名为xss的查询参数时,该参数的值会自动填充到xss
字符串参数中。例如,如果用户访问/reflect?xss=test
,那么xss
参数的值就会是test
,由于程序并未对用户输入进行任何过滤,直接输出,导致xss
漏洞
复现
/xss/reflect
/stored/store
和/stored/show
store将获取的xss属性值添加到cookie中,show将cookie中的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";
}
@RequestMapping("/stored/show")
@ResponseBody
public String show(@CookieValue("xss") String xss) {return xss;
}
访问http://127.0.0.1:8080/xss/stored/store?xss=<script>alert(1)</script>
后
cookie会增加xss属性
访问http://127.0.0.1:8080/xss/stored/show
即可将xss的内容展现出来
安全写法
@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;
}
这是利用HTML实体编码来防御XSS,HTML实体编码是一种将特殊字符转换为HTML实体的方法,这样用户输入就不会被浏览器解析为HTML标签或JavaScript代码,从而避免了xss漏洞的产生。