目前主流过滤XSS的三种技术

过滤

过滤,顾名思义,就是将提交上来的数据中的敏感词汇直接过滤掉。例如对"<script>"、"<a>"、"<img>"等标签进行过滤,有的是直接删除这类标签中的内容,有的是过滤掉之类标签中的on事件或是'javascript'等字符串,让他们达不到预期的DOM效果。

编码

像一些常见的字符,如"<"、">"等。对这些字符进行转换编码或者转义,让他们不直接出现在脚本中,从而使浏览器不会去执行这段脚本

限制

玩过XSS的朋友应该都知道,精心构造一个攻击链接往往需要较长的字符串。那我干脆就对提交上来的数据长度做一个限制,这样就能解决一个即使真的存在一个XSS漏洞,但由于数据长度的限制而导致这个漏洞无法真正被利用的情况。

常见绕过技术

1. 防过滤

有的网站会直接过滤"<script>"、"<a>"、"<img>"这些标签。在测试过程中,我们可以改变测试语句的大小写来绕过XSS规则.比如:
<script>alert("xss");</script>
可以转换为:
<ScRipt>ALeRt("XSS");</sCRipT>
对于只过滤一次“script”的情况我们还可以很巧合地把请求构造成这样:
<scr<script>ipt>alert("XSS")</scr<script>ipt>
对于完全过滤"script"、"javascript"等脚本相关的字符时,我们可以使用DOM Based XSS,例如:
<img src=1 onerror=alert(1)>

编码类:编码类绕过主要有URL编码,unicode编码,HTML编码,CSS编码和非常冷门的js-fuck编码

1. URL编码
URL编码最常见的是在用GET/POST传输时,顺序是把字符改成%+ASCII两位十六进制(先把字符串转成ASCII编码,然后再转成十六进制)。js处理URL编码的时候有三个函数可以使用,分别是escape()函数、encodeURI()函数 、encodeURIComponent()函数,对应的解码函数分别是unescape()、decodeURI()、decodeURIComponent();
2. unicode编码
Unicode编码的字符以%u为前缀,后面是这个字符的十六进制unicode的码点。当有些站点的后端验证可以识别Unicode编码的字符时,就可以用这个方法绕过了。
3. HTML编码
HTML编码的存在就是让他在代码中和显示中分开, 避免错误。他的命名实体:构造是&加上希腊字母,字符编码:构造是&#加十进制、十六进制ASCII码或unicode字符编码,而且浏览器解析的时候会先把html编码解析再进行渲染。但是有个前提就是必须要在“值”里。
4. CSS编码
主要是利用css中的expression()表达式表达式中可以执行js脚本来达到攻击的目的,但是我刚刚测试了一下expression()表达式在IE7及以下是有效的,在IE8及以上就失效了,无法识别。这种方法目前应该是无法使用了。
5. Ascii编码
这种方式主要利用了js的eval()函数和String.fromCharCode()函数。eval()函数是一个神奇的函数,可以用来计算一个字符串,将字符串变为js的表达式或者可执行语句,String.fromCharCode()函数则是将一段Ascii码转化为字符串。配合起来就例如下面的这一句代码:
<script>eval(String.fromCharCode(97,108,101,114,116,40,47,120,115,115,47,41));</script>
其作用相当于
<script>alert(/xss/)</script>

2. 针对限制

既然限制了数据长度,那我们可以从外部引用一个自己写的js,而不是直接全部写在请求当中。比如先自己写一个内容为alert(1)的js文件,上传到自己的空间里,由于script允许从外部引入js脚本,所以我们加上这句
"><script src='xss.js'></script>
直接加载脚本,可以突破对数据长度的限制。

3. 更多...

这里引用了一下别人整理得比较全的资料

总结

上面就总结了一些常见的XSS防护方式和绕过方式。其实XSS的绕过方式远远不止这么一些,这里我推荐一篇github上的帖子,对XSS的防护也是总结的比较详细的:
点击原文链接查看该帖子
对于攻击来说,无论如何就一句话,尽可能得让你的脚本能够被执行。
对于防护来说,该过滤的过滤,该转义的转义,尽量做到全面。
另外我们可以想一下XSS攻击是为了什么,无非是通过脚本访问本地存储的cookie和劫持流量实现恶意跳转。那么对于前者,我们可以使用HTTP-only(HTTP-only技术就是可以组织用户通过脚本来访问cookie,只允许通过HTTP协议来访问和传输,通常写在服务器发送给客户端的报文头中)来防护;对于后者,可以使用HTTPS安全协议。所以我们也可以不要局限于如何把XSS防护得一丝不漏,而在通过XSS要达到的目的上多下点功夫。

后记

我在测试XSS的时候发现Chrome的内核自带了一个XSS_AUDITOR的功能,这个功能基本是无法防护持续型(存储型)XSS的,但是却阻止了我全部的非持续型的XSS,所有非持续型XSS都无法绕过他的检测。所以想请教下大家非持续型XSS能不能绕过Chrome的这个功能的,该怎样绕过。

【转载】目前主流过滤XSS的三种技术的更多相关文章

  1. 转载:WinForm中播放声音的三种方法

    转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...

  2. ASP.NET MVC:多语言的三种技术处理策略

    ASP.NET MVC:多语言的三种技术处理策略 背景 本文介绍了多语言的三种技术处理策略,每种策略对应一种场景,这三种场景是: 多语言资源信息只被.NET使用. 多语言资源信息只被Javascrip ...

  3. Java 基础入门随笔(1) JavaSE版——java语言三种技术架构

    1.java语言的三种技术架构: J2SE(java 2 Platform Standard Edition):标准版,是为开发普通桌面和商务应用程序提供的解决方案.该技术体系是其他两者的基础,可以完 ...

  4. [转载]流式大数据处理的三种框架:Storm,Spark和Samza

    许多分布式计算系统都可以实时或接近实时地处理大数据流.本文将对三种Apache框架分别进行简单介绍,然后尝试快速.高度概述其异同. Apache Storm 在Storm中,先要设计一个用于实时计算的 ...

  5. 【转载】DDD分层架构的三种模式

    引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...

  6. APP开发的三种技术对比

    目前来说主流的App开发方式有三种:Native App .Web App.Hybird App.下面我们来分析一下这三种App开发方式的优劣对比: 一 :Native App 即 原生App开发 优 ...

  7. ASP、JSP、PHP 三种技术比较

    目前,最常用的三种动态网页语言有ASP(Active Server Pages),JSP(JavaServer Pages),PHP (Hypertext Preprocessor). 简 介 : A ...

  8. MySQL二进制日志文件Binlog的三种格式以及对应的主从复制中三种技术

    二进制日志文件Binlog的格式主要有三种: 1.Statement:基于SQL语句级别的Binlog,每条修改数据的SQL都会保存到Binlog里面. 2.ROW:基于行级别,每一行数据的变化都会记 ...

  9. [转载]sqlserver、Mysql、Oracle三种数据库的优缺点总结

    一.sqlserver优点:易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等:为数据管理与分析带来了灵活性,允许单位在快速变化的环境中 ...

随机推荐

  1. Java Byte取值范围

    Java Byte 的取值范围大家都知道(-128 ~ 127),那么-128 和 127 这两个数是怎么计算的呢? #大学知识回顾: 概念:负数的补码是该 数 绝 对 值 的 原 码 按 位 取 反 ...

  2. 使用jquery的方法和技巧

    1.下载一个jquery.js的文件 2.引入jquery.js文件 <script type="text/javascript" src="__PUBLIC__/ ...

  3. (1)pygame_第一个窗口程序

    ####可以使用python自带的IDLE交互式开发,也可以借助其他的编辑器,我这里采用的pycharm编辑器 1.导入我们所需要的模块 import pygame,sys   --导入我们需要的模块 ...

  4. JS数字金额转换为货币汉字形式

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  5. hdu 5954 -- Do not pour out(积分+二分)

    题目链接 Problem Description You have got a cylindrical cup. Its bottom diameter is 2 units and its heig ...

  6. python 发送邮件,未完

    def send_mail(): try: print "send mail..." # handle = smtplib.SMTP('smtp.163.com', 25) # h ...

  7. ImageSharp一个专注于NetCore平台图像处理的开源项目

    今天大家分享的是一个专注于NetCore平台图像处理的开源项目,老实说为这篇文章取名字想了5分钟,可能是词穷亦或是想更好的表达出这款开源项目的作用:这个项目在图像处理方面有很多功能,如:缩放,裁剪,绘 ...

  8. c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换

    字节数组byte[]与图片image之间的转化 字节数组转换成图片 public static Image byte2img(byte[] buffer) { MemoryStream ms = ne ...

  9. vim 自动在操作符 前后加上空格 C语言

    function! Align_Space() let current_line = getline('.') let replacement = substitute(current_line,'\ ...

  10. Archlinux 安装小计

    前阵子Fedora太不稳定,几乎不能正常使用了,同时也对版本形式的linux每次升级后各种扫尾和清扫工作感到有点厌倦,心里也非常想体验一下linux的滚动发行版,所以下定决心要干掉fedora,主流的 ...