XSS扫描器编写思路

本文探讨了一种XSS扫描器的设计思路,从URL解析、参数合并到潜在注入点检测,详细介绍了HTML解析器的实现,以及针对不同回显环境的针对性测试方法。通过实例演示和优化建议,展示了如何有效识别和利用反射型XSS漏洞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XSS扫描器

设计思路

数据来源 : 通过开放爬虫获得大量get请求url后,存入扫描器目录下的target.txt。

  1. 首先进行url解析,获得url,host,param(key:value)信息。
  2. 获得参数字典后,使用内置的危险参数字典(id,cb等常见反射xss参数)进行参数合并去重得到最终的测试参数集合。
  3. 遍历每一个参数进行潜在注入点测试,若响应包中无回显则进行下一个参数的测试,否则通过html解析器分析回显字符串的位置(html/attribute/script/comment)以及详细信息(tagname/content/attributes)。
  4. 通过第二步得到的回显点位置信息调用html_check,attribute_check,comment_check,script_check进行针对性测试并依据响应包判断是否存在反射型XSS。
  5. 结果保存在json文件中等待进一步处理。

url解析与参数合并

解析出url,host,param并与内置字典进行危险参数名合并(借鉴xsstrike)

host = urlparse(target).netloc
url = getUrl(target)
params = getParams(target)
params = add_extra_params(copy.deepcopy(params))

TOP_RISK_GET_PARAMS = {
   
   "id", 'action', 'type', 'm', 'callback', 'cb'}
def add_extra_params(params):
    risk_params = TOP_RISK_GET_PARAMS
    for p in risk_params:
        params[p] = ''
    return params

潜在注入点检测

目的

潜在注入点检测是判断输入的字符能否回显在页面,如果输入的字符不输出在页面就没有必要进行Fuzzing测试。
注入字符:
检测潜在注入点通常使用一个随机字符串,不直接用payload判断回显的原因是大多数应用都有防火墙和过滤机制,payload会被检测出恶意行为的特征从而被拦截,因此payload不回显不代表此次输入点不存在XSS漏洞,可能仅仅是payload被拦截过滤。

所以采用无害的随机数字字符就可以避免这种情况产生,先验证可注入,再调整Payload去绕过过滤;而随机的目的在于不希望固定字符成为XSS防御黑名单里的关键词。

实现思路

重写python中的htmlparser类,维护一个栈tree[]和一个结果列表tokenizer[]
htmlparser中开始标签,结束标签,自结束标签,文本内容和注释处理函数分别改为以下的作用

开始标签: 将标签名 属性(key value)字典加入到栈中
结束标签: 如果栈不为空 则弹出树中的开始标签 并将开始标签信息加入分词器tokenizer中
自结束标签 如<img/>: 调用开始标签压入栈 再调用结束标签加入分词器中
文本内容: 将文本内容加入栈中最后一个压入的标签content属性中(默认文本内容在两个标签中)
getTokenizer函数将树中的值压入tokenizer中

实现代码

html解析器

class MyHTMLParser(HTMLParser):
    def __init__(self):
        super().__init__()
        self.tree = []
        self.tokenizer = []
        self.root = None
        temp = {
   
   
            "tagname": "",
            "content": "",
            "attributes": []
        }

    def handle_starttag(self, tag, attrs):
        if len(self.tree) == 0:
            self.root = tag
        self.tree.append(
            {
   
   
                "tagname": tag,
                "content": "",
                "attributes":</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值