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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

XSS扫描器编写思路

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

文章目錄

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

XSS掃描器

設(shè)計(jì)思路

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

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

    解析出url,host,param并與內(nèi)置字典進(jìn)行危險(xiǎ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

    潛在注入點(diǎn)檢測(cè)

    目的

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

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

    實(shí)現(xiàn)思路

    重寫python中的htmlparser類,維護(hù)一個(gè)棧tree[]和一個(gè)結(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)容加入棧中最后一個(gè)壓入的標(biāo)簽content屬性中(默認(rèn)文本內(nèi)容在兩個(gè)標(biāo)簽中)
    getTokenizer函數(shù)將樹中的值壓入tokenizer中

    實(shí)現(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

    潛在注入點(diǎn)搜索

    將html響應(yīng)包內(nèi)容和請(qǐng)求時(shí)發(fā)送的測(cè)試字符傳入注入點(diǎn)搜索函數(shù),遍歷htmlparser解析的結(jié)果列表token。
    分為三種情況處理,測(cè)試字符處于tagname | content | attribute中。通過(guò)index來(lái)記錄潛在注入點(diǎn)的個(gè)數(shù)。最終把測(cè)試字符回顯的位置種類(html/script/attribute/comment),回顯點(diǎn)index(position)以及所處標(biāo)簽的詳細(xì)信息(tagname,content,attributes)加入occurenes數(shù)組中返回。
    (如果回顯點(diǎn)在屬性名或?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)]},})

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

    測(cè)試結(jié)果

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

    針對(duì)性測(cè)試

    針對(duì)性測(cè)試payload構(gòu)造借鑒了xray的思路,盡可能不發(fā)送敏感字符而采用隨機(jī)無(wú)害字符串去探測(cè)目標(biāo)是否存在xss漏洞,在掃描器漏報(bào)與誤報(bào)的天平中中傾向于誤報(bào)。實(shí)際探測(cè)結(jié)束后還要根據(jù)實(shí)際情況人工繞過(guò)黑白名單過(guò)濾等防御機(jī)制。
    通過(guò)潛在注入點(diǎn)測(cè)試得到回顯信息字典數(shù)組occurences后,遍歷回顯點(diǎn)數(shù)組,根據(jù)回顯位置類型分別調(diào)用針對(duì)性函數(shù)進(jìn)行進(jìn)一步測(cè)試,其中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)境的測(cè)試payload均不同,這里以回顯點(diǎn)處于html舉例并給出其他環(huán)境下的payload構(gòu)造思路和測(cè)試說(shuō)明。

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

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

    html回顯實(shí)現(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)簽名><隨機(jī)七位字符> 真實(shí)payload</被包裹標(biāo)簽名><svg οnlοad=alert`1`>else:flag = get_random_str(7)# 如果文本未被標(biāo)簽包裹(tagname==html) 僅僅為html文本中的內(nèi)容則payload不需要</{tagname}>去閉合上一個(gè)標(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('測(cè)試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)

    其他回顯的針對(duì)性測(cè)試流程

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

    回顯位置在html注釋中:

    回顯位置在script中:

    結(jié)果處理

    最后將針對(duì)性測(cè)試的結(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模塊整體由目前的多線程運(yùn)行改為多進(jìn)程+協(xié)程運(yùn)行
  • 參數(shù)合并時(shí)加入當(dāng)前頁(yè)面的隱藏字符
  • 參考文章:
    XSS掃描器成長(zhǎng)記
    跨站的藝術(shù)

    總結(jié)

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

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

    主站蜘蛛池模板: 亚洲精品99999 | 天天久久| 777中文字幕 | 麻豆视频国产 | 级毛片内射视频 | 久久亚洲免费视频 | 成 人片 黄 色 大 片 | 高潮无码精品色欲av午夜福利 | 美女啪啪免费视频 | 免费日韩视频 | 天堂在线视频网站 | 毛片xxx| 人人草在线观看 | 激情午夜网 | 99热一区二区 | 麻豆视频在线看 | 日韩毛片在线免费观看 | 秋霞一区二区三区 | 在线观看亚洲大片短视频 | 一级大片免费 | 久久久久久亚洲av无码专区 | 欧美骚视频 | 张津瑜国内精品www在线 | 欧美电影一区二区三区 | 国产成人在线电影 | 狠狠操在线观看 | 吻胸摸激情床激烈视频大胸 | a级一级黄色片 | 成人午夜精品福利 | 毛片在线视频 | 欧美日韩国产伦理 | 狠狠干狠狠干 | 国产精品视频大全 | 国产精品av免费观看 | 欧美日韩国产中文字幕 | 久色视频在线 | 6—12呦国产精品 | 91福利影院| 在线免费 | 蜜桃中文字幕 | 亚洲色图首页 | 国产精品videossex久久发布 | 99国产热| 九热在线视频 | 日韩精品www | 男男毛片 | 看片在线观看 | 视频黄色免费 | 欧美日日 | 肉体粗喘娇吟国产91 | 在线不卡二区 | 污污网站免费 | 2021毛片| 2020亚洲男人天堂 | 亚洲国产成人一区 | 国产三区视频 | 午夜三级在线观看 | 男女无遮挡做爰猛烈视频 | 在线午夜电影 | 午夜精品一区二区三 | 午夜播放 | 色多多在线视频 | 黄色大片在线播放 | 爱爱综合网 | 极品白嫩的小少妇 | 五月激情天| 最新地址av | 国产精品午夜福利视频234区 | 国内成人自拍视频 | 午夜影视剧场 | 奇米视频在线 | 免费国产高清 | 巨大黑人极品videos精品 | 午夜激情毛片 | 女人色极品影院 | 国产精品免费观看视频 | 国产精品国产三级国产三级人妇 | 久久99国产精品视频 | 精品无码人妻一区二区三区 | 国产精品电影网站 | 中文在线中文资源 | 国产日韩一级片 | 欧美a级在线免费观看 | 少妇人妻真实偷人精品视频 | 亚洲第9页| 狠狠操一区二区 | 精品中文在线 | 四虎影视免费永久观看在线 | 精品伦精品一区二区三区视频密桃 | 91av爱爱 | 捆绑中国女人hd视频 | 美女精品一区 | 精品美女一区二区三区 | 一区二区免费在线播放 | 特大黑人巨交吊性xxxx视频 | 国产熟女高潮一区二区三区 | 大奶毛片 | 污网站免费在线 | 美女脱衣服一干二净 |