文章目录
XSS扫描器
设计思路
数据来源 : 通过开放爬虫获得大量get请求url后,存入扫描器目录下的target.txt。
- 首先进行url解析,获得url,host,param(key:value)信息。
- 获得参数字典后,使用内置的危险参数字典(id,cb等常见反射xss参数)进行参数合并去重得到最终的测试参数集合。
- 遍历每一个参数进行潜在注入点测试,若响应包中无回显则进行下一个参数的测试,否则通过html解析器分析回显字符串的位置(html/attribute/script/comment)以及详细信息(tagname/content/attributes)。
- 通过第二步得到的回显点位置信息调用html_check,attribute_check,comment_check,script_check进行针对性测试并依据响应包判断是否存在反射型XSS。
- 结果保存在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":</