缺陷编号:WooYun-2014-088907
漏洞标题:易车网第二弹之多种姿势拿下CDN管理系统
相关厂商:易车
漏洞作者:plane636
提交时间:2014-12-27 16:03
公开时间:2015-02-10 16:04
漏洞类型:SQL注射漏洞
危害等级:高
自评Rank:20
漏洞状态:厂商已经确认
Tags标签:
2014-12-27: 细节已通知厂商并且等待厂商处理中
2014-12-29: 厂商已经确认,细节仅向厂商公开
2015-01-08: 细节向核心白帽子及相关领域专家公开
2015-01-18: 细节向普通白帽子公开
2015-01-28: 细节向实习白帽子公开
2015-02-10: 细节向公众公开
漏洞如此之多,让我产生了这是个蜜罐的错觉。CDN管理系统重要性不必多说。
上一弹发的是易车网数十台CDN节点rsync未授权访问,乍看之下rsync目录里都是一些squid日志和配置文件之类的东西,没什么能直接利用的。但是某个日志文件里发现了如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
--2014-05-13 17:30:38-- http://59.151.127.48/SystemOpsPlatform/php/Interface/receiveApplyFeedback.php<br> Connecting to 59.151.127.48:80... connected.<br> HTTP request sent, awaiting response...<br> HTTP/1.1 200 OK<br> Date: Tue, 13 May 2014 09:32:30 GMT<br> Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.3.10<br> X-Powered-By: PHP/5.3.10<br> Content-Length: 1<br> Keep-Alive: timeout=5, max=100<br> Connection: Keep-Alive<br> Content-Type: text/html; charset=utf-8<br> Length: 1 [text/html]<br> Saving to: `/dev/null'0K 100% 40.7K=0s2014-05-13 17:30:39 (40.7 KB/s) - `/dev/null' saved [1/1] |
先上去看看url是什么再说
wow,cdn的后台管理。但是现在账号密码都没有,rsync得到的信息也只有个url。先扫下端口,看看有没有突破口,可惜只开了80,只能从web端解决了。继续翻看url,发现php目录存在能够列目录。
翻来翻去,都是些看不了内容的php文件,好不容易发现一处rar压缩包,打开看看。
里面就两个php文件
1 |
<p><img src="https://wooyun.x10sec.org/static/bugs/full/03a804b33ee3f66ce85484bdf1bf88f92a132842.jpg" onerror="javascript:errimg(this);"></p> |
好吧坑爹,网站目录下就没有这两个文件。但是源码里面的内容还是引起了我的注意:
1 2 3 4 |
$sql_validation = "update VersionApplyValidation set Status=$validation_status,ErrorFlag=$error_flag,ErrorMessage='" . $error_msg . "'<br> where GUID = '" . $guid . "' and IP = '" . $ip . "' and InstanceID = $instanceid and ConfigInfoID = $configinfoid";<br> $sql_history = "update InstanceConfigHistory set Status=$history_status<br> where GUID = '" . $guid . "' and InstanceID = $instanceid and ConfigInfoID = $configinfoid"; |
几处post的参数没有处理就拼接进sql语句中了。这样看来网站存在注入的可能性就很大了。前台只有登陆,先在登陆试试注入吧。用户名构造如下语句:
1 |
admin' or '1' ='1'# |
竟然进来了。。。这种万能密码好久没碰见过了sqlmap也能跑出来
在后台测试的过程中发现一个问题
发现什么问题了吗?cookie里面只有用户名,没有session。。。。这是否意味着我们无需密码只要设置一下cookie就可以了呢?
2333333又成功了。现在洞主已经对这个系统的验证机制产生深刻的怀疑了,我们去登陆界面悄悄它是怎么验证的。翻看登陆页面的源代码,看到这段js的时候洞主惊呆了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
$(document).ready(function () {<br> var username = $.cookie('cdnops_user');<br> if (username != null) {<br> window.location.href = "/SystemOpsPlatform/home.html";<br> }<br> $("#UserName").val($.cookie('cdnops_remeber_user'));<br> $("#ckb_RememberMe").attr("checked", $.cookie('cdnops_remeber_ckb_status'));$("#UserName").focus();<br> });<br> function LogIn() {<br> if (CheckInput()) {<br> //调用PHP 进行登录验证<br> var username = del_blank($('#UserName').val());<br> var pwd = $.md5($('#PassWord').val());<br> $.post(<br> "/SystemOpsPlatform/php/login.php", { username: username, pwd: pwd, anticache: Math.floor(Math.random() * 1000) }, function (data, state) {<br> if (state == "success") {<br> if (data == "true") {<br> //写Cookie<br> var cookietime = new Date();<br> cookietime.setTime(cookietime.getTime() + (60 * 60 * 1000 * 4)); //cookie有效期4个小时<br> $.cookie('cdnops_user', username, { expires: cookietime, path: '/' });if ($("#ckb_RememberMe").attr("checked") == true) {<br> $.cookie('cdnops_remeber_user', username, { expires: 7, path: '/' });<br> $.cookie('cdnops_remeber_ckb_status', true, { expires: 7, path: '/' });<br> }<br> else {<br> $.cookie('cdnops_remeber_user', null, { path: '/' });<br> $.cookie('cdnops_remeber_ckb_status', null, { path: '/' });<br> }<br> window.location.href = "/SystemOpsPlatform/home.html";<br> }<br> else {<br> $(".ErrorMsg").text(data);<br> }<br> }<br> }, "text");<br> }<br> else {<br> }<br> }; |
竟在在客户端做的校验,这段代码的意思就是将用户名和密码发送到服务器端,如果匹配服务器将返回值“true”;若收到“true”则将用户名写入到cookie中并跳转到后台页面。这样的话我们只要将response改成true不就能登陆系统了吗。来验证下。在fiddler命令行中输入命令bpafter 59.151.127.48 设置response断点,然后提交一个错误的用户密码,此刻我们返回的是一个错误信息。
改成‘true’试试.走你
后台君我们又见面了此刻我又有了一个想法,既然登陆的验证是客户端做的,那么后台页面对用户的验证是不是也是在客户端呢。
果然在后台页面找到这样一处脚本,也验证了之前仅检测cookie用户名的说法。这样我们干掉此处js然后自己构造脚本也是可行的,不过有点多此一举就不赘述了。验证这块已经挖掘的差不多了,还有别的姿势能进入这个系统吗,当然有!本想通过注入获得点东西,但这个系统sqlmap跑出来是基于时间注入,获取数据老出错,数据库账号权限也有限,不从这下手了。后台有个用户管理,就在我通过列目录查看相关的文件时,点开了后台获取系统账号信息的php链接:
1 |
<p><img src="https://wooyun.x10sec.org/static/bugs/full/2d3580e4be870badb188f51a97c8a68469dda1df.jpg" onerror="javascript:errimg(this);"></p> |
卧槽,全部账号和md5都出来了,也不是什么强口令,google一下都能找到。当然,这里无需登录也是能获取到的。
这么多能够利用的点,我已经无力吐槽了,好多多年没见的利用方式这次再次用上。
要从系统架构完全重练了。
危害等级:高
漏洞Rank:15
确认时间:2014-12-2911:40
非常感谢提供的漏洞信息,我们会尽快进行处理
2014-12-30:漏洞已经修复,非常感谢给易车的帮助
易车的运维和开发真给力。
原文连接
的情况下转载,若非则不得使用我方内容。