日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XSS扫描器编写思路

發(fā)布時間:2023/12/31 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XSS扫描器编写思路 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • XSS掃描器
  • 設(shè)計思路
  • url解析與參數(shù)合并
  • 潛在注入點檢測
    • 目的
    • 實現(xiàn)思路
    • 實現(xiàn)代碼
      • html解析器
      • 潛在注入點搜索
      • 測試結(jié)果
  • 針對性測試
    • html回顯實現(xiàn)思路
    • html回顯實現(xiàn)代碼
    • 其他回顯的針對性測試流程
  • 結(jié)果處理
  • 待優(yōu)化部分

XSS掃描器

設(shè)計思路

數(shù)據(jù)來源 : 通過開放爬蟲獲得大量get請求url后,存入掃描器目錄下的target.txt。

  • 首先進(jìn)行url解析,獲得url,host,param(key:value)信息。
  • 獲得參數(shù)字典后,使用內(nèi)置的危險參數(shù)字典(id,cb等常見反射xss參數(shù))進(jìn)行參數(shù)合并去重得到最終的測試參數(shù)集合。
  • 遍歷每一個參數(shù)進(jìn)行潛在注入點測試,若響應(yīng)包中無回顯則進(jìn)行下一個參數(shù)的測試,否則通過html解析器分析回顯字符串的位置(html/attribute/script/comment)以及詳細(xì)信息(tagname/content/attributes)。
  • 通過第二步得到的回顯點位置信息調(diào)用html_check,attribute_check,comment_check,script_check進(jìn)行針對性測試并依據(jù)響應(yīng)包判斷是否存在反射型XSS。
  • 結(jié)果保存在json文件中等待進(jìn)一步處理。
  • url解析與參數(shù)合并

    解析出url,host,param并與內(nèi)置字典進(jìn)行危險參數(shù)名合并(借鑒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_PARAMSfor p in risk_params:params[p] = ''return params

    潛在注入點檢測

    目的

    潛在注入點檢測是判斷輸入的字符能否回顯在頁面,如果輸入的字符不輸出在頁面就沒有必要進(jìn)行Fuzzing測試。
    注入字符:
    檢測潛在注入點通常使用一個隨機字符串,不直接用payload判斷回顯的原因是大多數(shù)應(yīng)用都有防火墻和過濾機制,payload會被檢測出惡意行為的特征從而被攔截,因此payload不回顯不代表此次輸入點不存在XSS漏洞,可能僅僅是payload被攔截過濾。

    所以采用無害的隨機數(shù)字字符就可以避免這種情況產(chǎn)生,先驗證可注入,再調(diào)整Payload去繞過過濾;而隨機的目的在于不希望固定字符成為XSS防御黑名單里的關(guān)鍵詞。

    實現(xiàn)思路

    重寫python中的htmlparser類,維護一個棧tree[]和一個結(jié)果列表tokenizer[]。
    htmlparser中開始標(biāo)簽,結(jié)束標(biāo)簽,自結(jié)束標(biāo)簽,文本內(nèi)容和注釋處理函數(shù)分別改為以下的作用

    開始標(biāo)簽: 將標(biāo)簽名 屬性(key value)字典加入到棧中
    結(jié)束標(biāo)簽: 如果棧不為空 則彈出樹中的開始標(biāo)簽 并將開始標(biāo)簽信息加入分詞器tokenizer中
    自結(jié)束標(biāo)簽 如<img/>: 調(diào)用開始標(biāo)簽壓入棧 再調(diào)用結(jié)束標(biāo)簽加入分詞器中
    文本內(nèi)容: 將文本內(nèi)容加入棧中最后一個壓入的標(biāo)簽content屬性中(默認(rèn)文本內(nèi)容在兩個標(biāo)簽中)
    getTokenizer函數(shù)將樹中的值壓入tokenizer中

    實現(xiàn)代碼

    html解析器

    class MyHTMLParser(HTMLParser):def __init__(self):super().__init__()self.tree = []self.tokenizer = []self.root = Nonetemp = {"tagname": "","content": "","attributes": []}def handle_starttag(self, tag, attrs):if len(self.tree) == 0:self.root = tagself.tree.append({"tagname": tag,"content": "","attributes": attrs})def handle_endtag(self, tag):if len(self.tree) > 0:r = self.tree.pop()self.tokenizer.append(r)def handle_startendtag(self, tag, attrs):self.handle_starttag(tag, attrs)self.handle_endtag(tag)def handle_data(self, data):if self.tree:self.tree[-1]["content"] += datadef handle_comment(self, data):self.tokenizer.append({"tagname": "#comment","content": data,"attributes": []})def getTokenizer(self):while len(self.tree):r = self.tree.pop()self.tokenizer.append(r)return self.tokenizer

    潛在注入點搜索

    將html響應(yīng)包內(nèi)容和請求時發(fā)送的測試字符傳入注入點搜索函數(shù),遍歷htmlparser解析的結(jié)果列表token。
    分為三種情況處理,測試字符處于tagname | content | attribute中。通過index來記錄潛在注入點的個數(shù)。最終把測試字符回顯的位置種類(html/script/attribute/comment),回顯點index(position)以及所處標(biāo)簽的詳細(xì)信息(tagname,content,attributes)加入occurenes數(shù)組中返回。
    (如果回顯點在屬性名或?qū)傩灾抵袆t詳細(xì)信息的content值為key or value)
    部分代碼:

    # 如果xsscheck處于tagname中 if _xsscheck in tagname:occurences.append({'type': 'inTag','position': index,'details': token}) # 如果xsscheck在attribue中 for k, v in attributes:content = Noneif _xsscheck in k:content = "key"elif v and _xsscheck in v:content = "value"if content:occurences.append({"type": "attribute","position": index,"details": {"tagname": tagname, "content": content, "attributes": [(k, v)]},})

    針對pentesterLab XSS第一關(guān)的返回報文進(jìn)行潛在注入點測試,測試payload為xsscheck

    測試結(jié)果

    返回報文中回顯位置 <h2> Hello xsscheck<footer> <p>? PentesterLab 2013</p> </h2>潛在注入點搜索結(jié)果展示 注入點位置種類:html 注入點index:0 注入點詳細(xì)信息:標(biāo)簽名:h2 標(biāo)簽屬性:[] 標(biāo)簽內(nèi)容:Hello xsscheck

    針對性測試

    針對性測試payload構(gòu)造借鑒了xray的思路,盡可能不發(fā)送敏感字符而采用隨機無害字符串去探測目標(biāo)是否存在xss漏洞,在掃描器漏報與誤報的天平中中傾向于誤報。實際探測結(jié)束后還要根據(jù)實際情況人工繞過黑白名單過濾等防御機制。
    通過潛在注入點測試得到回顯信息字典數(shù)組occurences后,遍歷回顯點數(shù)組,根據(jù)回顯位置類型分別調(diào)用針對性函數(shù)進(jìn)行進(jìn)一步測試,其中paramsName為當(dāng)前遍歷的參數(shù)名,paramsCopy為當(dāng)前的掃描url的參數(shù)字典。

    for occurence in occurences:_type = occurence['type']if _type == 'html':self.html_check(occurence, url, paramsCopy, paramsName)elif _type == 'attribute':self.attribute_check(occurence, url, paramsCopy, paramsName)elif _type == 'comment':self.comment_check(occurence, url, paramsCopy, paramsName)elif _type == 'script':self.script_check(occurence, url, paramsCopy, paramsName)

    每種環(huán)境的測試payload均不同,這里以回顯點處于html舉例并給出其他環(huán)境下的payload構(gòu)造思路和測試說明。

    html回顯實現(xiàn)思路

    假如潛在注入點在html文本中,則根據(jù)occurence中details得到被包裹的標(biāo)簽名。假如被style標(biāo)簽包裹考慮使用特殊的payload:expression(a(odfqkv))進(jìn)行測試。
    在包裹的標(biāo)簽名不為style的情況下則采用</被包裹標(biāo)簽名><隨機測試字符串>嘗試閉合前標(biāo)簽并構(gòu)造新標(biāo)簽來測試。此時要考慮一種特殊情況,即回顯點在html文本中不被任何標(biāo)簽所包裹,潛在注入點搜素會返回包裹標(biāo)簽為html,此時就不用加上</html>,測試payload僅為<隨機測試字符串>。
    這里是借鑒了xray的xss掃描技巧不發(fā)送帶有敏感字符如img,svg,而采用隨機測試字符來判斷能否產(chǎn)生新標(biāo)簽。
    確定了測試payload后則將當(dāng)前測試參數(shù)的值改為測試payload,發(fā)送后進(jìn)行回顯點判斷,假如在響應(yīng)報文中出現(xiàn)了新標(biāo)簽則代表成功閉合了前標(biāo)簽可以在當(dāng)前環(huán)境下構(gòu)造新標(biāo)簽.

    html回顯實現(xiàn)代碼

    def html_check(self, occurence, url, params, paramName):_type = occurence['type']details = occurence['details']# 如果在標(biāo)簽名是style 采用形如expression(a(odfqkv))的payload --> IE6及以下的瀏覽器if details['tagname'] == 'style':payload = "expression(a({}))".format(get_random_str(6))true_payload = 'expression(alert(1))'params[paramName] = payloadres = requests.get(url=url, params=params, headers=getHeader())_locations = searchInputInResponse(html_doc=res.text, xsscheck=payload)for location in _locations:if payload in location['details']['content'] and location['details']['tagname'] == 'style':tmp_res = {'host': get_complete_url(url, params),'ParamPosition': 'query','ParamKey': paramName,'Payload': true_payload,'Request': '','Response': '','msg': 'IE下可執(zhí)行的表達(dá)式 expression(alert(1))'}self.result.append(tmp_res)# 如果被非style標(biāo)簽包裹 試探payload:</被包裹標(biāo)簽名><隨機七位字符> 真實payload</被包裹標(biāo)簽名><svg οnlοad=alert`1`>else:flag = get_random_str(7)# 如果文本未被標(biāo)簽包裹(tagname==html) 僅僅為html文本中的內(nèi)容則payload不需要</{tagname}>去閉合上一個標(biāo)簽if details['tagname'] == 'html':payload = "<{}>".format(flag)true_payload = "{}".format("<svg οnlοad=alert`1`>")else:payload = "</{}><{}>".format(random_upper(details["tagname"]), flag)true_payload = "</{}>{}".format(random_upper(details["tagname"]), "<svg οnlοad=alert`1`>")params[paramName] = payload# print('測試payload是' + payload)res = requests.get(url=url, params=params, headers=getHeader())_locations = searchInputInResponse(html_doc=res.text, xsscheck=flag)for location in _locations:if location['details']['tagname'] == flag:# print('發(fā)現(xiàn)了flag標(biāo)簽詳細(xì)信息為' + str(location['details']) + '\nxss類型:可在html中構(gòu)造新標(biāo)簽')tmp_res = {'host': get_complete_url(url, params),'ParamPosition': 'query','ParamKey': paramName,'Payload': true_payload,'Request': '','Response': '','msg': 'html文本中可構(gòu)造新標(biāo)簽'}self.result.append(tmp_res)

    其他回顯的針對性測試流程

    回顯位置在標(biāo)簽屬性中:

    回顯位置在html注釋中:

    回顯位置在script中:

    結(jié)果處理

    最后將針對性測試的結(jié)果存在結(jié)果數(shù)組并寫入result.json文件

    count = len(result)print('共發(fā)現(xiàn)漏洞' + str(count) + '處')json_data = json.dumps(result, indent=4, ensure_ascii=False)root_path = os.getcwd()result_path = root_path + '\\' + args.outputwith open(result_path, 'w', encoding='utf-8') as f:f.write(json_data)

    待優(yōu)化部分

  • 將結(jié)果以html展示
  • scan模塊整體由目前的多線程運行改為多進(jìn)程+協(xié)程運行
  • 參數(shù)合并時加入當(dāng)前頁面的隱藏字符
  • 參考文章:
    XSS掃描器成長記
    跨站的藝術(shù)

    總結(jié)

    以上是生活随笔為你收集整理的XSS扫描器编写思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。