XSS漏洞常见攻击方式

Posted The-Back-Zoom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS漏洞常见攻击方式相关的知识,希望对你有一定的参考价值。

1.危害

都是通过js脚本来实现的浏览器内核版本也会影响到js代码的实现

  • 1、钓鱼欺骗

  • 2、网站挂马

  • 3、身份盗用

  • 4、盗取网站用户信息

  • 5、垃圾信息发送

  • 6、劫持用户Web行为

  • 7、XSS蠕虫

2.原理

XSS 属于被动式的攻击。攻击者先构造一个跨站页面,利用script、、等各种方式使得用户浏览这个页面时,触发对被攻击站点的http 请求。此时,如果被攻击者如果已经在被攻击站点登录,就会持有该站点cookie。这样该站点会认为被攻击者发起了一个http 请求。而实际上这个请求是在被攻击者不知情的情况下发起的,由此攻击者在一定程度上达到了冒充被攻击者的目的。精心的构造这个攻击请求,可以达到冒充发文,夺取权限等等多个攻击目的。在常见的攻击实例中,这个请求是通过script 来发起的,因此被称为Cross Site Script。攻击Yahoo Mail 的Yamanner 蠕虫是一个著名的XSS 攻击实例。YahooMail 系统有一个漏洞,当用户在web 上察看信件时,有可能执行到信件内的javascript 代码。病毒可以利用这个漏洞使被攻击用户运行病毒的script。同时Yahoo Mail 系统使用了Ajax技术,这样病毒的script可以很容易的向Yahoo Mail 系统发起ajax 请求,从而得到用户的地址簿,并发送病毒给他人。

3 .分类

3.1反射型

反射型XSS又称非持久型XSS,这种攻击方式往往具有一次性。

3.2存储型

存储型XSS又称持久型XSS,攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。

3.3DOM型

从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型的XSS漏洞不需要与服务器端交互,它只发生在客户端处理数据的阶段。

4.攻击方式

4.1反射型

攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞

4. 2存储型

这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意

4.3DOM型

用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞

5.绕过

5.1手动绕过

在介绍手动绕过之前必须先介绍一些编码方式

  1. 浏览器解析页面的过程:

html文档解析(DOM Tree) =》 浏览器发送获取嵌入在html中的对象
=》css解析 =》遇到JS解析,其他解析就停止

  1. 编码:
    2.1 url编码:
    %加上该字符串的ASSCALL

    2.2 html编码:
    HTML实体编码: 以&开头,分号结尾的。 例如“<”的编码是“&lt”
    字符编码:8进制或者16进制ASCALL或者Unicode编码,前面再加上&#

    2.3 JS编码:
    1.三个八进制数字,如果不够个数,前面补0,例如“<”编码为“\\074”
    2.两个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\\x3c”
    3.四个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\\u003c”
    4.对于一些控制字符,使用特殊的C类型的转义风格(例如\\n和\\r)

5.2XSS平台绕过

6.解决方案

1.过滤输入的字符包括"’" ““” “<” “>” "on"等
2.对输入到页面的数据进行相应的编码转换,包括HTML实体编码,JS编码等

7.自己写靶场学习

1. 创建数据库

create database loophole;
use loophole;
create table storage
(
    id int auto_increment,
    name char(10) not null,
    message char(100) not null,
    primary key (id)
)
    comment 'xss存储型表';
#自动增加的键必须为主键

2.在phpstudy等web环境下建立如下文件

1. reflect.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>XSS利用输出环境构造代码</title>
</head>
<body>
    <h1>请输入你想显示的字符串</h1>
    <form action="" method="get">
        <input type="text" name="xss_input_name" placeholder="请输入字符串">
        <input type="submit">
        <img src="1" onerror="alert(xss)">
    </form>
    <br>
    <!-- <pre>
        <h1>解题答案</h1>
    普通型:  -->
    <!-- 复杂型:'"><img src="" οnerrοr="alert(123)"><img src="' -->
    <!-- </pre> --> 

   <?php
if(isset($_GET['xss_input_name']))

    // echo $_GET["xss_input_name"] => 无任何过滤的xss
    echo '<input type="text" value="' . $_GET["xss_input_name"] . '">'; 
    // => 需要让input标签闭合,并且输出或者执行注入的js代码($_GET["xss_input_name"])

else

    echo '<input type="text" value="请输入">';


?> 
</body>
</html>


2.storage.php

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>存储型XSS</title>
    <style>
        div
            width: 300px;
            margin: auto;
            background-color: rgb(red, green, blue);
        
        table 
            width: 400px;
            border-collapse: collapse;
            text-align: center;
            margin: auto;
        

        table th,
        table td 
            border: 1px solid;
            padding: 5px;
        

        table thead 
            background-color: lightcyan;
        

        table caption 
            font-size: larger;
            margin-bottom: 8px;
        

        body>p 
            display: flex;
        

        p>a 
            text-decoration: none;
            color: #555;
            border: 1px solid;
            padding: 5px 10px;
            margin: 10px 2px;
        

        .active 
            background-color: seagreen;
            color: white;
            border: 1px solid seagreen;
        
    </style>
</head>

<body>
    <div>
    <h1>请输入留言类容</h1>
    <form action="" method="POST">
        <label for="name">名字:</label><input type="text" name="name" id="name">
        <br>
        <label for="message">留言:</label><textarea name="message" id="message" cols="30" rows="10" placeholder="请输入留言"></textarea>
        <input type="submit">
    </form>
 </div>
    <?php
    if (isset($_POST['message'])) 
        $sql = <<<SQL
        insert into storage(name,message) values (?,?);
        SQL;
        $db = new PDO('mysql:dbname=loophole', 'root', '901026yk');
        $stmt = $db->prepare($sql);
        $arr = [$_POST['name'], $_POST['message']];
        $stmt->execute($arr);
        $db = null;
    
    $sql = <<<SQL
    select * from storage;
SQL;
$db = new PDO('mysql:dbname=loophole', 'root', '901026yk');
$stmt = $db->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll();
$html = "
<table>
<caption>留言表</caption>
<thead>
    <tr>
        <th>id</th>
        <th>name</th>
        <th>message</th>
    </tr>
</thead>
<tbody>
";
foreach($result as $items)

extract($items);
$html .= "
    <tr>
        <td>$id</td>
        <td>$name</td>
        <td>$message</td>
    </tr>
  ";

$html .= " </tbody>
</table>";
echo $html;
?>
</body>
</html>

3.dom_xss.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>XSS利用DOM树</title>
</head>
<body>
    <script>
        function show(event)
        
            const input = event.target;
            if(event.key == 'Enter')
            
                let div = document.querySelector('.first');
                // p.innerText = input.value;=>这样不会执行XSS代码
                div.textContent = input.value
                console.log(input.value);
                input.value = null;
            
        
    </script>
    <div>
        <h6>显示的类容如下:</h6>
         <div class="first">
            
         </div>
    </div>
    <div>
        <h6>请输入你想显示的类容:</h6>
         <input type="text" placeholder="请输入类容" onkeydown="show(event)">
    </div>
     
</body>
</html>

8.靶场答案

8.1reflect.php

输入'"><img src="" onerror="alert(123)"><img src="'构造html代码形成闭环,就可以进行xss攻击了

8.2storage.php

存储型xss,输入<script>alert(/xss/)</script>即可

8.3dom_xss.html

这个不建议使用<script>alert(/xss/)</script>进行XSS攻击,因为页面不会解析<script>alert(/xss/)</script>,只会把<script>alert(/xss/)</script>当作文本,所以不会执行js代码,使用<img src="" onerror="alert(123)">即可

以上是关于XSS漏洞常见攻击方式的主要内容,如果未能解决你的问题,请参考以下文章

常见Web安全漏洞

Web 安全漏洞之 XSS 攻击

转载 | Web 安全漏洞之 XSS 攻击

常见Web安全漏洞深入解析

常见的web安全问题总结

web安全测试之 xss攻击