Python安全开发之简易Xss检测工具(详细注释)

核心代码:

python 复制代码
import requests
# requests 库 - HTTP 请求处理库
# 【常用功能】:
#   requests.get(url)     - 发送 HTTP GET 请求
#   requests.post(url, data) - 发送 HTTP POST 请求
#   response.text         - 获取响应体内容(字符串)
#   response.status_code  - 获取 HTTP 状态码 (200, 404, 500 等)
#   response.headers      - 获取响应头信息
#   response.cookies      - 获取 Cookie 信息

import argparse
# argparse 库 - Python 标准库,用于解析命令行参数
# 【核心组件】:
#   ArgumentParser()  - 创建参数解析器对象
#   add_argument()    - 添加参数定义(位置参数/可选参数)
#   parse_args()      - 解析命令行参数并返回命名空间对象
# 【示例】:
#   parser = argparse.ArgumentParser(description="工具描述")
#   parser.add_argument("url", help="参数说明")  # 位置参数(必需)
#   parser.add_argument("-v", "--verbose", action="store_true")  # 可选参数
#   args = parser.parse_args()  # 解析结果:args.url, args.verbose

from urllib.parse import urlparse, urlencode, urlunparse, parse_qs
# urllib.parse 模块 - URL 解析和处理工具
# 【各函数功能】:
#   urlparse()   - 将 URL 拆解为 6 元组 (scheme, netloc, path, params, query, fragment)
#   parse_qs()   - 将查询字符串 (?key=value&key2=value2) 解析为字典 {key: [value1], ...}
#   urlencode()  - 将字典编码为查询字符串,doseq=True 处理列表值
#   urlunparse() - 将 6 元组重新组合为完整 URL 字符串


from bs4 import BeautifulSoup
# BeautifulSoup 库 - HTML/XML 文档解析库
# 【主要功能】:
#   解析 HTML 文档,构建 DOM 树
#   提供便捷的方法查找、遍历、修改节点
# 【常用方法】:
#   BeautifulSoup(html, 'html.parser')  - 创建解析对象
#   soup.find('tag')         - 查找第一个匹配标签
#   soup.find_all('tag')     - 查找所有匹配标签
#   soup.select('css 选择器')  - 使用 CSS 选择器查找元素
#   tag.text / tag.string    - 获取标签文本内容
#   tag['attribute']         - 获取标签属性
# 【本例说明】: 虽然导入但未在代码中使用,可能用于后续扩展(如解析 HTML 检测 XSS)

def scan_xss(url):
    """
    扫描 URL 是否存在反射型 XSS 漏洞
    
    【反射型 XSS 原理】:
    攻击者构造恶意 URL,包含 XSS payload
    用户点击后,payload 被发送到服务器
    服务器未过滤直接将 payload 返回并在浏览器执行
    
    【检测原理】:
    1. 向 URL 参数注入特殊测试字符串 (payload)
    2. 发送请求获取响应
    3. 检查响应中是否原样返回 payload
    4. 如果返回,说明存在反射型 XSS 风险
    
    【参数说明】:
    url - 待检测的目标 URL,必须包含查询参数
    
    【返回值】:
    bool - True 表示存在漏洞,False 表示未发现漏洞
    """
    
    is_vulnerable = False  # 漏洞标志位,初始化为 False
    payload = "IsThisReflected123"  # XSS 测试 payload,使用特殊字符串检测是否被反射
    
    # 步骤 1: 解析 URL,提取各个组件
    parsed_url = urlparse(url)
    # 示例:urlparse("http://test.com/page?id=1&name=abc")
    # 返回:ParseResult(scheme='http', netloc='test.com', path='/page', 
    #                   params='', query='id=1&name=abc', fragment='')
    
    # 步骤 2: 解析查询参数字符串为字典
    query_params = parse_qs(parsed_url.query)
    # 示例:parse_qs('id=1&name=abc')
    # 返回:{'id': ['1'], 'name': ['abc']}
    # 注意:每个参数的值都是列表,因为同名参数可能出现多次
    
    # 检查是否有查询参数
    if not query_params:
        # 如果 URL 没有 ?param=value 这样的查询参数,无法进行 XSS 测试
        print("[!] 无查询参数")
        return False
    
    print(f"正在扫描...{url}")
    
    # 遍历每个参数进行测试
    for parma,values in query_params.items():
        # parma: 参数名(如 'id')
        # values: 参数值列表(如 ['1'])
        
        original_value = values[0]  # 取原始值的第一个(parse_qs 返回的是列表)
        
        # 创建测试参数的副本,避免修改原始数据
        test_parma = query_params.copy()
        
        # 在当前参数值后追加 payload
        # 例如:id=1 → id=1IsThisReflected123
        test_parma[parma] = original_value + payload
        
        # 将修改后的参数字典重新编码为查询字符串
        new_query = urlencode(test_parma, doseq=True)
        # doseq=True: 对列表类型的值也进行迭代编码
        # 例如:{'id': ['1IsThisReflected123'], 'name': ['abc']}
        # 编码为:'id=1IsThisReflected123&name=abc'
        
        # 重组完整的测试 URL
        test_url = urlunparse((
            parsed_url.scheme,      # 协议 (http/https)
            parsed_url.netloc,      # 域名和端口
            parsed_url.path,        # 路径
            parsed_url.params,      # 路径参数(分号;后的内容)
            new_query,              # 新的查询字符串(已添加 payload)
            parsed_url.fragment     # 片段标识(#后的内容)
        ))
        
        try:
            # 发送 HTTP GET 请求到测试 URL
            response = requests.get(test_url)
            
            # 检测响应中是否包含原始 payload
            # 如果服务器原样返回 payload,说明可能存在反射型 XSS
            if payload in response.text:
                print(f"\n[+] 高危:检测到潜在的反射型 XSS 漏洞!")
                print(f"    - 漏洞 URL: {test_url}")
                print(f"    - 受影响的参数:{test_parma[parma]}")
                is_vulnerable = True
            
            # ⚠️ 注意:这里检测不够完善
            # 真正的 XSS 检测应该:
            # 1. 使用 BeautifulSoup 解析 HTML,检查 payload 是否在可执行上下文中
            # 2. 检测是否进行了 HTML 实体编码
            # 3. 尝试实际的 XSS payload (<script>alert(1)</script>等)
            
        except requests.RequestException as e:
            # 捕获网络异常(连接失败、超时、DNS 错误等)
            print(f"[!] 在测试参数 '{test_parma[parma]}' 时发生网络错误:{e}")
        
        # 如果当前参数未检测到漏洞
        if not is_vulnerable:
            print("[+] 未检测到 XSS 漏洞")
        
        # ⚠️ 注意:这里的 return 位置有问题
        # 应该在循环外返回,现在只测试了第一个参数就返回了
        return is_vulnerable

def main():
    """
    主函数:程序入口点
    
    【执行流程】:
    1. 打印警告声明
    2. 创建命令行参数解析器
    3. 解析用户输入的 URL
    4. 调用 XSS 扫描函数
    """
    
    print("=" * 60)
    print("!!! 警告:本工具仅用于经授权的教育和安全测试目的 !!!")
    print("!!! 未经许可,对任何系统进行漏洞扫描都是非法的 !!!")
    print("=" * 60 + "\n")
    
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description="XSS 漏洞检测工具")
    
    # 添加位置参数 url(必需提供)
    parser.add_argument("url", help="目标 URL")
    
    # 解析命令行参数
    args = parser.parse_args()
    # 例如:python Xss_scan.py http://test.com?id=1
    # args.url = "http://test.com?id=1"
    
    # 调用 XSS 扫描函数
    scan_xss(args.url)
    
if __name__ == "__name__":
    # ⚠️ 注意:这里有 bug!应该是 "__main__" 而不是 "__name__"
    # 正确的写法:if __name__ == "__main__":
    # 当前写法导致 main() 永远不会被执行
    main()

URL处理流程:

python 复制代码
原始 URL: http://test.com/page?id=1&name=abc
                    ↓
        urlparse() 解析
                    ↓
ParseResult(scheme='http', netloc='test.com', path='/page', 
            query='id=1&name=abc', ...)
                    ↓
        parse_qs(query) 解析参数
                    ↓
{'id': ['1'], 'name': ['abc']}
                    ↓
        添加 payload
                    ↓
{'id': ['1IsThisReflected123'], 'name': ['abc']}
                    ↓
        urlencode() 编码
                    ↓
'id=1IsThisReflected123&name=abc'
                    ↓
        urlunparse() 重组
                    ↓
http://test.com/page?id=1IsThisReflected123&name=abc
相关推荐
yaoxin5211232 小时前
368. Java IO API - 基本文件属性
java·开发语言·python
程序媛徐师姐2 小时前
Python基于机器学习的就业岗位推荐系统【附源码、文档说明】
python·机器学习·python机器学习·就业岗位推荐系统·python就业岗位推荐系统·python机器学习就业推荐·就业岗位推荐
建军啊2 小时前
java审计进阶
java·开发语言·python
码界筑梦坊2 小时前
329-基于Python的交通流量数据可视化分析系统
开发语言·python·信息可视化·数据分析·django·vue·毕业设计
一只鼠标猴2 小时前
甲方应急响应:从事件处置到溯源闭环实战指南
安全·web安全·网络安全·应急响应·应急·应急溯源
阿提哈德2 小时前
患者病历归档流程流程图绘制指南
安全·信息可视化·架构·流程图·能源
zzb15803 小时前
Agent记忆与检索
java·人工智能·python·学习·ai
wzl202612133 小时前
从0到1搭建私域数据中台——公域引流的数据采集与分析
python·自动化·企业微信
源码之家3 小时前
大数据毕业设计汽车推荐系统 Django框架 可视化 协同过滤算法 数据分析 大数据 机器学习(建议收藏)✅
大数据·python·算法·django·汽车·课程设计·美食