在一次内部对抗中,遇到一个存储系统,开发语言为PHP,主界面可进行用户名与口令字的爆破,因此在爆破成功获取用户名与口令后进入后台进行手工测试,测试一些功能点,是否存在可以利用的地方。因为是开源的系统,首先读了一下源码,发现是通过MVC模式编写的,对于我来说,审计起来较为困难,所以先进行黑盒测试,测试具体功能点。
在进入到后台后,因为是一个私人网盘,首先浏览了以下是否存在一些私密文件,包含目标公司的相关信息等内容(无果);
接下来针对该系统进行测试,因为目标系统允许上传任意类型的文件,所以黑盒测试中,我第一个测试的功能就是;在不知道目标系统如何存储上传文件的情况下,是否可以将上传文件跨目录存储,(这里猜测存储文件的目录下是没有执行权限的,所以是否可以通过拼接路径等方式,将文件存储到其他目录下面)。
经测试,未果。
在针对上述测试无果后,直接来到了后台的功能区,经测试,在模板编辑这一功能中发现可以用户自定义模板文件来上传任意PHP代码。
对MVC开发模式的审计仅停留在国内的ThinkPHP框架中,复现了一些漏洞,具体动态调试查看请求是如何路由到哪一个具体的控制器的方法中。所以根据之前的经验,小弟的审计思路如下:
已经通过黑盒测试得到了具体漏洞触发的URL,并且此版本的系统无法搭建在windows环境下,没有具体搭建linux + php + Xdebug环境。
URL:domain/index.php/apps/templateeditor/settings/mailtempalte
所以根据漏洞触发URL,直接定位到apps/templateeditor下的目标文件。
使用的视图文件直接是该文件夹下的 /templates/settings-admin.php 文件
所以定位到了该文件夹下。这个步骤是跳过了从index.php文件路由至该编辑模板文件的这一过程。后续寻找也没有准确的找出这一过程,先存疑。
具体漏洞调用链:
在 OCATemplateEditorApp 这个命令空间下实例化的 TemplateEditor 类,(这个类是继承的OCPAppFrameworkApp 这个类)并是使用了其中的注册路由的方法;
回溯该路由:
回溯RouteConfig类中的Register方法, 调用了processSimpleRoutes方法,具体解析字符串设置路由在该函数中。通过解析字符串来匹配。
最终路由至文件:
WBEROOT/apps/templateeditor/controller/adminsettingscontroller.php文件中的updateTemplate方法;
该方法中实例化调用了MailTemplate类中的setContent方法
传入的参数为POST所提交的Content参数值;
最终调用到了 file_put_contents方法,将恶意代码写入到文件中,路径为
/WEBROOT/themes/$theme/$template
在黑盒测试+审计后,尝试该漏洞是否可经未授权直接写入文件,在WEBROOT/index.php文件中引用了 lib/base.php 文件
该文件中定义了OC类并于最底部初始化了该类:
其中又交叉引用了许多类与方法来初始化系统的一些全局参数,其中
在index.php中引用的OC::handleRequest();方法检测了用户的凭据。
所以无法未授权直接调用。
并且后续查看IREQUEST接口,该接口为对HTTP 所提交的参数有多余的过滤操作。
在审计过程中使用的是逆向思维“通过漏洞找代码触发点”,但如果正向审计估计以我现在的阶段,审计起来较为困难。还望师傅们能够不吝赐教! --征鞍
感谢征鞍师傅的积极投稿,也欢迎大家加入我们,互相交流和分享技术,共同成长进步! --NOVASEC
END
本文始发于微信公众号(NOVASEC):某开源PHP存储系统后台文件上传漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论