【Java代码审计】XSS漏洞

1. XSS漏洞

XSS(Cross Site Scripting,为了和层叠样式表(Cascading Style Sheet,CSS)有所区分,故称XSS)跨站脚本攻击是一种针对网站应用程序的安全漏洞攻击技术。它可以实现用户会话劫持、钓鱼攻击、恶意重定向、点击劫持、挂马、XSS蠕虫等。
XSS攻击类型可以分为:反射型、存储型、DOM型。

1.1 反射型XSS攻击

访问http://localhost:8080/tomcat_demo_war_exploded/xssdemo?name=%3Cscript%3Ealert(1)%3C/script%3E

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>反射型XSS攻击-Demo</title>
</head>
<body>
    <%=request.getParameter("name")%>
</body>
</html>

1.2 存储型XSS攻击

在留言框中输入XSS语句并提交。

在这里插入图片描述

刷新页面,出现弹框

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.*" %>
<%
    String username = request.getParameter("username");
    String content = request.getParameter("content");

    String message = "GUEST_MESSAGE";
    List<Map<String, String>> comments = new ArrayList<Map<String, String>>();

    if (content != null && username != null) {
        Object object = application.getAttribute(message);

        if (object != null) {
            comments = (List<Map<String, String>>) object;
        }

        Map<String, String> comment = new HashMap<String, String>();

        comment.put("username", username);
        comment.put("content", content);


        comments.add(comment);

        application.setAttribute(message, comments);
    }
%>
<html>
<head>
    <title>存储型XSS攻击-Demo</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
    }
</style>
<body>
<div style="border: 1px solid rgba(198,198,198,0.93);">
    <div style="text-align: center; height: 40px;">
        <h1>在线留言板</h1>
    </div>
    <div>
        <dl>
            <%
                Object object = application.getAttribute(message);

                if (object instanceof List) {
                    comments = (List<Map<String, String>>) object;

                    for (Map<String, String> comment : comments) {
            %>
            <dd>
                <div style="min-height: 50px; margin: 20px; border-bottom: 1px solid #9F9F9F;">
                    <p><B><%=comment.get("username")%>
                    </B>留言:</p>
                    <p style="margin: 20px 0 5px 0; font-size: 15px;">
                    <pre><%=comment.get("content")%></pre>
                    </p>
                </div>
            </dd>
            <%
                    }
                }
            %>
        </dl>
    </div>
    <div style="background-color: rgba(255,255,255,0.95); border: 1px solid rgba(198,198,198,0.93);">
        <form action="#" method="POST" style="margin: 30px;">
            昵称: <input type="text" name="username" style="width:300px; height: 28px;"/><br/><br/>
            <textarea name="content" style="overflow: auto;width: 100%; height: 300px;"></textarea>
            <input type="submit" value="提交留言" style="margin-top: 25px; width: 80px; height: 30px;"/>
        </form>
    </div>
</div>
</body>
</html>

1.3 Dom型XSS

请求访问http://localhost:8080/tomcat_demo_war_exploded/dom.jsp?content=%22%3E%3Cscript%3Ealert(1)%3C/script%3E

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>DomXSS攻击-Demo</title>
</head>
<body>
<%--http://localhost:8080/tomcat_demo_war_exploded/dom.jsp?content=%22%3E%3Cscript%3Ealert(1)%3C/script%3E--%>
Content: <span style="color: red;" ></span>
<input id="domXSS" type="hidden" value="<%=request.getParameter("content")%>" />
<script>
    var date = document.getElementById("domXSS").value;
    document.getElementsByTagName("span")[0].innerHTML = date;
</script>
</body>
</html>

2. XSS的防御

XSS漏洞攻击最常见的防御措施是特殊字符转义。

2.1 ESAPI

ESAPI是owasp提供的一套API级别的web应用解决方案。能够校验XSS、SQL、恶意文件后缀名等。

import org.owasp.esapi.ESAPI;

String content = request.getParameter("content");
content = ESAPI.encoder().encodeForHTML(content);
content = ESAPI.encoder().encoderForJavaScript(content); //防御dom xss使用jsencode

2.2 自定义特殊字符转义

对特殊字符进行替换转义。

import org.apache.commons.lang.StringUtils;

private String htmlEncode(String content) {
    content = StringUtils.replace(content, "&", "&amp;");
    content = StringUtils.replace(content, "<", "&lt;");
    content = StringUtils.replace(content, ">", "&gt;");
    content = StringUtils.replace(content, "\"", "&quot;");
    content = StringUtils.replace(content, "'", "&#x27;");
    content = StringUtils.replace(content, "/", "&#x2F;");
    return content;
}

3.3 XSSFilter

全局过滤

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;

public class XSSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {

    }



    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;

        // 创建HttpServletRequestWrapper,包装原HttpServletRequest对象,示例程序只重写了getParameter方法,
        // 应当考虑如何过滤:getParameter、getParameterValues、getParameterMap、getInputStream、getReader
        HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) {
            public String getParameter(String name) {
                // 获取参数值
                String value = super.getParameter(name);

                // 简单转义参数值中的特殊字符
                return value.replace("&", "&amp;").replace("<", "&lt;").replace("'", "&#039;");

            }
        };

        chain.doFilter(requestWrapper, resp);
    }

    @Override
    public void destroy() {

    }

}

web.xml配置添加XSSFilter过滤器

<!--    XSS过滤器 -->
    <filter>
        <filter-name>XSSFilter</filter-name>
        <filter-class>XSSFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>XSSFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello_Brian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值