核心代码:
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