记一次攻破某网站拿到超级管理员权限的过程

在这个信息满天飞的时代,网络安全尤为重要。然而隐私数据泄露却频频发生。

泄露事件

去年华住会员的开房信息,在暗网被泄露的一干二净(鄙人有幸下载了测试数据,住房时间、身份证号、姓名…等等非常详细),完整数据大小高达53G,涉及1.2亿人…

今年陕西普通话查询页面,不知道哪个傻蛋程序员开发的。用户名、身份证、分数都写在了静态页面里,查看源码所有学生的信息可以说是一览无余。

拿后台过程

  然而今天我拿到后台的这个也是个没有逻辑头脑的傻蛋写的程序。一起往下看看吧!

  作为一名“耿直”的程序员,下班无聊也是逛各种技术论坛,Github、博客园、开源中国、v2ex、csdn、吾爱等等。
  而就是在某论坛看到一用户上传了一个破解版的某话术APP,说是登陆即是VIP。本着感兴趣的态度下载安装,操作了一番,发现还真是破解的。

拿站过程

  这样完了吗,不,双手不自觉的打开了抓包工具,抓取了该软件一波,庆幸的是该软件用的ip没有安全证书,不是SSL加密请求,所以所有的请求API返回的数据都可以直接查看。

  经过不断请求分析了一波后发现,整个软件的数据都是以api的形式从后台传送数据的。在返回数据中有一些图片地址:http://47.**.***.126:80/ueditor/jsp/upload/image/20181223/1545576760006064759.jpg 让我有了突破口。
  于是惯用的不断一级一级的请求测试看看有没有做权限防护,因为这一块之前是遇到没有做访问权限的,打开可以直接查看一些存储文件。如下截图,到现在还没修复(话说路径怎么都差不多?因为截图中这些文件也是话术聊天类的图片文件,不过不是这个软件的,我感觉这个app软件用的图片资料也是从这盗过去的)

  该app抓到的图片地址逐级测试请求

  试到根域名也没有啥可看的资源,都是Apache Tomcat/8.5.14提示的404

  不过有另一个大的发现,因为根域名是后台管理页面http://47.**.***.126:80/

  尝试着的输入了常用的用户名密码登陆,都是提示无该用户,不过这个页面没有验证码可以字典暴力请求破解。只是有些费时间,不过写个python脚本放到我的服务器上日夜不停的跑倒也痛快。
  f12查看网页源码后,发现整个页面代码不多,js也简单。但是仔细观察js逻辑后发现,这个ajax登陆就是一个纸老虎做样子。下面贴一下该后台登陆页面的js源码,用的还是layui。

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
layui.use('form', function () {
var form = layui.form;
//监听提交
form.on('submit(submitData)', function (data) {
$.ajax({
type: "POST",
url: '/managelogin/manageLogin',
data: {
userAccount: data.field.userAccount,
userPassword: data.field.userPassword
},
success: function (data) {
if (data.status == 200) {
Msg.success("登陆成功");
sessionStorage.obj = data.data.id;
document.write("<form action=/managelogin/userIndex method=post name=form1 style='display:none'>");
document.write("<input type=hidden id = id name=id value='" + data.data.id + "'/>");
document.write("</form>");
document.form1.submit();
} else {
Msg.error(data.msg);
}
},
error: function () {
Msg.error("error");
// $t.closeWindow();
}
})
return false;
});
});

  仔细查看逻辑并不难拆解,首先管理员输入用户名密码,点击登陆会携带数据请求到后台,当后台返回数据时,发现用到的数据只有成功时data.id和else的data.msg。然后搞笑的逻辑来了,这个傻蛋程序员先是用js增加form表单,属性隐藏,表单的请求地址为/managelogin/userIndex,然后发送的参数只有一个隐藏输入框的内容,这个内容就是登陆返回的id,然后post提交。
  于是我尝试性的拼接这个地址看看返回啥,http://47.\*\*.\*\*\*.126:80/managelogin/userIndex回车,吓!居然跳转页面了,

  看这样子可能进了后台了(这就绕过了?也太垃圾了吧)。但是显示的只有用户信息列表,但是这也足够危险,发现可以直接操作用户,设置会员等。为了验证我的猜想可行,于是我在网上找了很长时间(同类软件甚多)终于找到了该软件的正版(未破解的)下载量居然有近18w。安装后用手机号登录,然后根据分配用户id,web后台查找设置永久会员,然后在手机登录后果真成为永久会员,会员到期是2118-11-22,果然这是个大bug。

  回到js代码,那个自动提交表单是有id参数带过去的,于是我在地址栏ip后拼接上了id,关于id一般为1的差不多是第一个用户,有可能是管理员,于是http://47.\*\*.\*\*\*.126:80/managelogin/userIndex?id=1回车,虽然form是post请求,但是这样拼接还是跳转页面了,果不其然到了真正的后台管理页面,这个页面菜单一竖排,并且左上角用户显示的是adminstartor,点击就一个下拉菜单是修改密码,看来指定是超级管理员的后台页面了。

  看下主要菜单页面的截图

主要菜单

  1. 聊天管理(管理的数据对应打开app的首页,一万六千多条数据)

  2. 分类管理(管理的数据对应app首页的分类标题)

  3. 会员管理是开通会员的价格表,会员说明就一行数据不知道干啥的,轮播图设置就是app首页的轮播图。

  4. 聊天案例(数据管理对应app的聊天案例页)

软件营收

  等等截图就不一一展示了,下面说下这个软件的盈利情况,从订单列表数据来看,收入是非常可观的,来张最新的截图

  可以看到订单数达到了4w多条,不过我上午的测试发现,app内点击充值会员按钮跳转支付宝/微信不付款也会产生订单,所以实际付款人数不能具体确认。

  但是从用户反馈菜单可以看到八百多条反馈,大多说的充值了没会员云云,要是有800用户充值也是赚不少钱的,够一个普通农民一年的收入了。
  不过有点纠结的是为啥用户反馈充值后没有会员呢?既然能设置会员证明会员体系没问题啊,不过我猜想有可能用户充值完后没有重新登录一遍的事吧。

分析总结

  虽然是拿到后台了,但是没有任何成就感。这对专业安全人员来说可能是羞耻,你拿这个让人家测试安全性能,人家可能会说:Are you kidding me?。是的,对于程序员来说也是一种耻辱。

  1. 为什么能直接绕过后台呢?
      我猜想这套登录体系并没有做到真正的登录。(说人话),也就是说用户根本没有登录,这是个没有登录体系的系统。真正意义的登录是要把用户信息存储到session中的。然后对请求进行拦截器权限拦截的。
  2. 那这个后台登录页面是干什么的?
      这个问题问的好!(笑)我感觉这个伪登录是做给老板看的,开发程序的是个新手。做不出真正的登录只能这样糊弄过去就算了,至于测试,完全没有测试就上线了。或者说这是个高级聪明的程序员,故意留个漏洞给自己用(防止不结尾款?窥探用户隐私?…)。

所以一个健壮的系统是要不断进行打造测试升级的。一个小小的漏洞就足以毁掉一整个程序。


-------------本文结束感谢您的阅读-------------
感觉文章不错,就赏个吧!
0%