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)">即可

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安全天天学

你的鼓励是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值