跨站脚本漏洞

author author     2022-08-01     573

关键词:

跨站脚本漏洞,首先看一下专业说明:

跨站脚本漏洞可以再分成两类:Stored attack 和 Reflected attack。这两种攻击的主要区别在于有效负荷到达服务器的方式。Stored attack 仅以某种形式存储在目标服务器上(例如在数据库中),或通过提交至公告板或访问者日志来进行存储。如果请求了所存储的信息,受害者将在自己的浏览器中检索和执行攻击代码。而 Reflected attack 则来自其他地方。当通过动态生成的网页中的服务器端,直接将 Web 客户端的用户输入包含在内时,就会出现 Reflected attack。通过某些社会工程手段,例如通过恶意链接或“伪装”表单,攻击者可以哄骗受害者提交信息,然后对信息进行修改以包含攻击代码,并将其发送至合法服务器。注入的代码随后将反射回用户的浏览器,由于此代码来自受信任的服务器,用户的浏览器将会执行此代码。两种攻击的影响都是相同的。

关于XSS 跨站脚本攻击(Cross Site Scripting),最简单直接的就是在输入框中存入例如<script>alert(600)</script>这样的js代码,影响到系统的正常使用,甚至威胁系统安全。想了解更多的专业解释,可以在网上搜索一下,参考百度百科的解释http://baike.baidu.com/view/2161269.htm

但在实际的应用中如何去防止这种攻击呢,下面给介绍个办法。

自己写 filter 拦截来实现,但要注意的时,在WEB.XML 中配置 filter 的时候,请将这个 filter 放在第一位.

配置过滤器

技术分享 程序代码
public class XSSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
    }

}


再实现 ServletRequest 的包装类

技术分享 程序代码

import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class XSSRequestWrapper extends HttpServletRequestWrapper {

    public XSSRequestWrapper(HttpServletRequest servletRequest) {
        super(servletRequest);
    }

    @Override
    public String[] getParameterValues(String parameter) {
        String[] values = super.getParameterValues(parameter);

        if (values == null) {
            return null;
        }

        int count = values.length;
        String[] encodedValues = new String[count];
        for (int i = 0; i < count; i++) {
            encodedValues[i] = stripXSS(values[i]);
        }

        return encodedValues;
    }

    @Override
    public String getParameter(String parameter) {
        String value = super.getParameter(parameter);

        return stripXSS(value);
    }

    @Override
    public String getHeader(String name) {
        String value = super.getHeader(name);
        return stripXSS(value);
    }

    private String stripXSS(String value) {
        if (value != null) {
            // NOTE: It‘s highly recommended to use the ESAPI library and uncomment the following line to
            // avoid encoded attacks.
            // value = ESAPI.encoder().canonicalize(value);

            // Avoid null characters
            value = value.replaceAll("", "");

            // Avoid anything between script tags
            Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");

            // Avoid anything in a src=‘...‘ type of e­xpression
            scriptPattern = Pattern.compile("src[ ]*=[ ]*\‘(.*?)\‘", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");

            scriptPattern = Pattern.compile("src[ ]*=[ ]*\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");

            // Remove any lonesome </script> tag
            scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");

            // Remove any lonesome <script ...> tag
            scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");

            // Avoid eval(...) e­xpressions
            scriptPattern = Pattern.compile("eval\((.*?)\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");

            // Avoid e­xpression(...) e­xpressions
            scriptPattern = Pattern.compile("e­xpression\((.*?)\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");

            // Avoid javascript:... e­xpressions
            scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");

            // Avoid vbscript:... e­xpressions
            scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");

            // Avoid onload= e­xpressions
            scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
        }
        return value;
    }
}


例子中注释的部分,就是采用 ESAPI library 来防止XSS攻击的,推荐使用.
当然,我还看到这样一种办法,将所有的编程全角字符的解决方式,但个人觉得并没有上面这种用正则表达式替换的好

技术分享 程序代码

private static String xssEncode(String s) {
        if (s == null || s.equals("")) {
            return s;
        }
        StringBuilder sb = new StringBuilder(s.length() + 16);
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c) {
            case ‘>‘:
                sb.append(‘>‘);// 全角大于号
                break;
            case ‘<‘:
                sb.append(‘<‘);// 全角小于号
                break;
            case ‘‘‘:
                sb.append(‘\‘);
                sb.append(‘‘‘);
                sb.append(‘\‘);
                sb.append(‘‘‘);
                break;
            case ‘"‘:
                sb.append(‘\‘);
                sb.append(‘"‘);// 全角双引号
                break;
            case ‘&‘:
                sb.append(‘&‘);// 全角
                break;
            case ‘\‘:
                sb.append(‘\‘);// 全角斜线
                break;
            case ‘#‘:
                sb.append(‘#‘);// 全角井号
                break;
            case ‘:‘:
                sb.append(‘:‘);// 全角冒号
                break;
            case ‘%‘:
                sb.append("\\%");
                break;
            default:
                sb.append(c);
                break;
            }
        }
        return sb.toString();
    }



当然,还有如下更简单的方式:

技术分享 程序代码
private String cleanXSS(String value) {
         //You‘ll need to remove the spaces from the html entities below
        value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
        value = value.replaceAll("\(", "& #40;").replaceAll("\)", "& #41;");
        value = value.replaceAll("‘", "& #39;");
        value = value.replaceAll("eval\((.*)\)", "");
        value = value.replaceAll("[\"\‘][\s]*javascript:(.*)[\"\‘]", """");
        value = value.replaceAll("script", "");
        return value;
    }


在后台或者用spring 如何实现呢:
首先添加一个jar包:commons-lang-2.5.jar ,然后在后台调用这些函数:

技术分享 程序代码
StringEscapeUtils.escapeHtml(string); 
StringEscapeUtils.escapeJavaScript(string); 
StringEscapeUtils.escapeSql(string);
 

当然,我记得在spring 里面好像有一个 HtmlUtils.htmlEscape , 同样可以做到 过滤 XSS 攻击。从上面的介绍可以看出,防止 XSS 攻击并不难,就是要小心。

独家分享:跨站脚本攻击xss详解(代码片段)

跨站脚本攻击XSS跨站脚本攻击概念介绍跨站脚本攻击产生原因跨站脚本攻击造成危害跨站脚本攻击分类介绍反射型XSS或不持久型XSS(中危漏洞)存储性XSS或持久型XSS(高危漏洞)DOMXSS(低危漏洞/中危漏洞)... 查看详情

最新系统漏洞--esriarcgisserver跨站脚本漏洞

...务的企业级软件平台。EsriArcgisServer10.8.1及之前版本存在跨站脚本漏洞。远程攻击者可利用该漏洞通过诱导用户点击恶意链接执行任意JavaScript代码。 查看详情

web漏洞挖掘指南-xss跨站脚本攻击(代码片段)

一、漏洞原理跨站脚本英文全称(CrossSiteScripting跨站脚本),为了不和css层叠样式表(英文全称:CascadingStyleSheets)混淆,因此将跨站脚本缩写为XSS。产生XSS漏洞根本原因其实是web应用未对用户的输入进行严格的... 查看详情

web安全之跨站脚本攻击漏洞(代码片段)

跨站脚本(XSS)漏洞跨站脚本攻击(CrossSiteScripting),为不和层叠样式表(CascadingStyleSheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web⻚⾯⾥插⼊恶意JavaScript代码,当⽤户浏览该... 查看详情

最新系统漏洞--fortinetfortigate跨站脚本漏洞

最新系统漏洞2021年10月22日受影响系统:FortinetFortiGate<=6.4.1FortinetFortiGate6.2.2<=Version<=6.2.5描述:CVE(CAN)ID:CVE-2020-15937FortinetFortiGate是美国飞塔(Fortinet)公司的一套网 查看详情

xss(crosssitescripting)跨站脚本攻击

XSS攻击:跨站脚本攻击(CrossSiteScripting),为不和层叠样式表(CascadingStyleSheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。 XSS攻击分成两类:一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句,如:dvbbs... 查看详情

jquery跨站脚本漏洞xsswith$(location.hash)漏洞

...数据所使用的正则表达式存在缺陷,可能导致LOCATION.HASH跨站漏洞已测试成功版本:    jquery-1.6.min.js,jquery-1.6.1.min.js,jq 查看详情

独家分享:跨站脚本攻击xss详解(代码片段)

跨站脚本攻击XSS跨站脚本攻击概念介绍跨站脚本攻击产生原因跨站脚本攻击造成危害跨站脚本攻击分类介绍反射型XSS或不持久型XSS(中危漏洞)存储性XSS或持久型XSS(高危漏洞)DOMXSS(低危漏洞/中危漏洞)... 查看详情

独家分享:跨站脚本攻击xss详解(代码片段)

跨站脚本攻击XSS跨站脚本攻击概念介绍跨站脚本攻击产生原因跨站脚本攻击造成危害跨站脚本攻击分类介绍反射型XSS或不持久型XSS(中危漏洞)存储性XSS或持久型XSS(高危漏洞)DOMXSS(低危漏洞/中危漏洞)... 查看详情

xss跨站脚本漏洞详解(代码片段)

本文参考资料:《Web安全深度剖析》张炳帅跨站脚本漏洞:2017年OWASPTOP7XSS又叫CSS(CrossSiteScripting),但是和指层叠样式表(CascadingStyleSheets)缩写重名,所以叫XSSXSS是指攻击者在网页中嵌入脚本代码,通... 查看详情

xss漏洞(跨站脚本)

不要轻信用户提交上来的数据alert消息太难看,因此开发一个aspx页面用来统一展示消息ShowMessage.ashx//主页将判断重定向到另一个页面if(TextBox1.Text!="gao"){Response.Redirect("sey.aspx?Name=密码不正确!");}//在ShowMessage.aspx进行验证Label1.Text=Req... 查看详情

PCI 合规性的资源/服务?修复“类别参数中的跨站脚本漏洞”漏洞?

】PCI合规性的资源/服务?修复“类别参数中的跨站脚本漏洞”漏洞?【英文标题】:Resources/servicesforPCIcompliance?Fixfor"Cross-sitescriptingvulnerabilityincategoryparameter"vulnerability?【发布时间】:2011-09-0221:11:09【问题描述】:一家审... 查看详情

jqgrid跨站脚本漏洞解决

问题描述:  jqgrid版本4.5.2  用户输入值为<script>alert(123)</script>时,jqgrid默认的展示方法会将字符串转换为dom元素,于是就产生了这样的情况    一些不怀好意的人就会通过这些方法对项目发起攻击。 如下... 查看详情

fortify漏洞之cross-sitescripting(xss跨站脚本攻击)

...书接上文,继续对Fortify漏洞进行总结,本篇主要针对XSS跨站脚步攻击漏洞进行总结如下:1、Cross-SiteScripting(XSS跨站脚本攻击)1.1、产生原因:1.数据通过一个不可信赖的数据源进入Web应用程序。对于ReflectedXSS(反射型),不可... 查看详情

url存在跨站漏洞httphost头攻击漏洞解决方案(代码片段)

...网站脚本跨网站脚本(Cross-sitescripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻... 查看详情

dvwa-xss(跨站脚本漏洞)

首先进入DVWA页面,选择low等级。进入xxs(reflect)页面。我们在弹窗中进行测试,输入xxs则结果如下:然后再输入<xss>xss脚本试一试。结果如下:查看元素发现helllo后面出现一对xss标签,似乎可以html注入。接下来我们进行xss... 查看详情

跨站脚本攻击(xss)复现与防范(代码片段)

...型XSS攻击复现常用的XSS测试语句关于XSS的防御xss漏洞介绍跨站脚本攻击,英文全称是CrossSiteScripting,为了不和层叠样式表(CascadingStyleSheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSSXSS攻击&#x 查看详情

xss跨站脚本攻击

...s攻击  3.2、存贮型xss攻击  3.3、DOMBasedXSS(基于dom的跨站点脚本攻击)4、XSS攻击实例分析  例1、简单XSS攻击  例2、盗取cookie5、XSS漏洞修复  5.1、html实体  5.2、HTMLEncode  5.3、修复漏洞方针  5.4、PHP中的相应函... 查看详情