免责申明
本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。
一、前言
上一次在审计过程当中审计出来了相关的一个权限绕过漏洞,当我把这个漏洞拿出来给学员讲解的时候,学员审计出来一个新的漏洞,并且已经进行提交获取了对应赏金,我们来看看,权限绕过漏洞文章如下:
权限绕过漏洞
Ambition,公众号:进击安全一次针对PHP项目的代码审计
二、任意文件上传漏洞分析
在进行权限绕过自己拿出来讲解的时候,过了一天一个学员审计出来了新的漏洞,搭配权限绕过可以实现RCE的效果,我们来看看。
直接定位文件上传功能点,发现只存在一个,大概率是将原生的文件上传方法封装到了一个自写方法当中。
可以看到没有什么鉴权方式,鉴权后缀呀等等操作,但是封装到了location_upload方法当中,查看哪里调用了此方法。
在同一文件当中发现了,又将loaction_upload方法封装在了create方法当中,并且这个方法使用switch进行了流程控制,当storage当中的type等于local的时候才会执行,我们先来查看哪里又进行调用了create方法。
再此方法当中发现位于文件Controller/api.php当中进行了调用并且也是额$_FILE可控上传,其中存在一些if判断。
发现允许用户传入参数key参数并且不可以为空,然后图片大小不可以超过固定大小,这几个都好说,但是第三个进行了SQL查询,查询结果给到了user变量,这个我们要进行查看一下结果是什么,查询的是Secret_key的值。
再上图当中我们可以发现这个key是默认的,并且这个管理员账户会发现在我们进行进行安装源码的时候会自动进行安装所以这个key默认存在,也算是硬编码的一种形式,我们知道了给到user变量之后,继续往下看。
只有key等于Secret_key的时候才可以上传,给到user之后进行查询capacity的配额是多少,看看允许上传多少。
这一块的默认系统安装的时候给默认管理员分配的也是很大的,所以不用太去考虑,继续往下发现接着查询user当中的role_id值,并且给到了role变量。
可以看到我们默认是1,对应表当中的信息也是超级管理员。
继续往下看代码。
这里同时获取了对应的storage_id值,我们根据上上图可以知道为1000。
进入到了create方法当中我要执行其中的loaction_uplaod方法,但是发现他的要求值为local,所以我们继续看,sid为1000进行sql查询在表Storage表当中1000值对应的信息是否为local。
现在我们知道了对应的就是local值,可以进行本地上传。
三、漏洞验证
我们知道了TP开发的框架,并且漏洞文件位于Controller/api.php当中的upload方法所以直接构造路径:
http://xxxx.com/index.php(入口文件)/api/upload
可以看到上传成功。
四、完结