java-sec-code的xss

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

java-sec-code的xss_第1张图片
/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=
cookie会增加xss属性
java-sec-code的xss_第2张图片
访问http://127.0.0.1:8080/xss/stored/show即可将xss的内容展现出来

java-sec-code的xss_第3张图片
安全写法

@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漏洞的产生。

你可能感兴趣的:(java,xss)