记一次代码审计的APP渗透

好久没更新了,刚好遇到,就记录一下吧

注:本文的测试经过授权

0x01 信息收集

第一步肯定先抓包找到域名,访问一下。

上面这个图是我本地的,远程的访问比较慢就不截图了。没有做UA头检测等,它本身就是移动端和PC端都可以访问的一种cms。

看到开放的端口,21尝试爆破和匿名登陆都没有成功。而8888以为是sun-answerbook,其实是BT。

因为服务器性能的原因以及还有其他人同时在看,因此没有进行大规模的扫描探测。后面小线程扫描发现了源代码,后面再说。

0x02 黑盒测试

上传点,经过测试白名单验证,没办法利用。总计有六七个上传点吧,有的是直接不作为文件上传,反正都没什么进展。

有个视频导入功能,测试了一下,也没什么用。

21爆破不成,3389爆破也不成,所以下面直接来审代码看能不能有突破。

0x03 白盒审计

0x3.1 本地环境搭建

emmm,是真的麻烦,我第一次碰到这么难搭的cms。是个收费的cms,源码来看应该是破解版,需要输入购买码等,安装完以后需要配置nginx伪静态规则。

那具体的路由和伪静态规则我这里就不多说了,看看代码加上熟悉一下网站基本就能心里有数。

0x3.2 越权访问后台

/admin-panel/autoload.php

后台是通过autoload.php来进行模块加载,呈现给用户,但是这里只是可以看,具体的后端操作还是在另外的php中。可以看到这里并没有进行身份验证,因此存在越权。

会存在上图这种情况,发现并没有引进常用函数文件,估计是通过其他文件来引用。

后面看到/ajax.php(ajax目录存放的就是后台的后端php)

因此payload如下:

http://www.my.com/ajax.php?type=../admin-panel/autoload&page=manage-users

可以通过它,它确实引入了函数文件,但是需要绕过:

简单来说就是不能让$is_error为1,那么就要GET传入hash并且通过CheckMainSession的检查并返回true(上面的print_r()是我调试自己加上的)

Secure()就是用来过滤的,做字符串安全性检查。跟进CheckMainSession()发现,要想返回true就需要我们传入的$hash_id和$_SESSION[‘main_hash_id’]是一样的。所以看想办法能不能绕过。

跟进/assets/includes/function_gernel.php

这个main_hash_id生成规则比较简单,1111-9999随机数的sha1哈希值,一开始想用py写个爆破的,但是发现Python请求的main_hash_id和浏览器不一样,那直接burpsuite跑一下就行了。

response打印了这个hash是因为我本地环境,调试时留下的。

后面发现不用爆破也可以,网站会隔段时间就请求notifications,会有hash:

那我们最终payload就是:

http://www.my.com/ajax.php?hash=90d6ff0d935b83169155f13651052247da58e416&type=../admin-panel/autoload&page=manage-users

但是只能看到当前设置,因为后端php其实都是做了身份验证的。首先上图可以看到所有用户名的密码,其次有ftp设置,访问s3模板可以看到(如果管理员在网站配置了ftp)。

0x3.3 安装未验证重装

/install/index.php

并没有验证是否安装。并且就算是我们传入的sql相关信息连接不上数据库,仍然会更新config.php,因此这里有两种利用思路。

第一种,本地服务器mysql开启外连,重新安装cms获得后台账号密码。

第二种,就算不开启本地也可以随便填sql,然后闭合字符串getshell。大概看了一下,url参数有过滤器检测是否是url,但是purcharse_code因为是破解版可以随便填。本地效果:

本地能成,那去目标试一下,访问/install确实可以,但是点击next没有反应,因此效仿本地访问:

http://www.my.com/install/?page=installation

闭合字符串不用我多说了吧,直接getshell。

0x3.3 绕过补丁再次RCE

服务器做了修补,判断了$ServerErrors[]不为空则不会写入。那我们需要满足一下条件:连接上数据库,url符合、规则(check_()是总返回success的)。

要么拿到远程的数据库账号密码要么本地开外链。

如上可getshell。

发现了原本config.php的备份,给他再恢复过去就可以了。

Leave a Reply

Your email address will not be published. Required fields are marked *

3 × 2 =