代码审计 - PHP - 通用系统审计
代码审计 - PHP - 通用系统审计
前言
本篇文章首发在先知社区(为先知打Call) 作者Zjacky(本人) 先知社区名称: Zjacky
原文链接为https://xz.aliyun.com/t/13866
代码审计篇章都是自己跟几个师傅们一起审计的1day或者0day(当然都是小公司较为简单),禁止未经允许进行转载,发布到博客的用意主要是想跟师傅们能够交流下审计的思路,毕竟审计的思路也是有说法的,或者是相互源码共享也OK,本次审计的目标是一套也是各大高校使用的通用系统,已经提交相关SRC平台进行修复
路由分析
直接看登录接口
路由为 /setting.php/index/login
找对应源码
第一个接口setting对应Application下的文件
第二个接口Index对应Setting下的Controller文件名字
第三个接口为Controller的方法名字
代码审计
上传
Application\Admin\Controller\UploadController.class.php
在这个路径下继承了一个upload控制器父类
所以调用的接口如下
实例化了一个UploadFile()
对象然后给他的属性赋值
重点关注以下代码
1 |
|
发现这里会调用UploadFile()
的魔术方法 跟进
1 |
|
这里其实就是问题的本身,要是传进来的在config里头不存在则返回空,那么我们去看一下config的设置
1 |
|
emmm根本没有 exts
所以说后缀根本没有检测,可以从从调用的upload中查看
断到一个叫自动检查附件
步进一下进入check函数存在检查文件类型
再次跟进一下checkExt发现是一个很强的校验白名单
1 |
|
但是重点是他并没有赋值进去
在这进行反向验证,讲前面的属性修改为在config里头的内容
再次进行断点跟到最后面的config的地方发现成功修改
所以这套系统只要存在 $upload->exts =
这个的上传接口 就存在任意文件上传
SQL(绕redis缓存)
直接看前台控制器了
找到这个路由存在sql的问题
在这个代码里头,可以发现 $count
跟 $listJson
是关键
$count
的设置是为了不频繁查询,所以这里只要设置随机伪造的PHPSESSID就可以了
$listJson
的设置就尤为关键了 if (!$listJson) 这里的语句是 我的redis去查phone就是要查不到 为null才能执行下面的sql语句,所以phone就是要不存在的手机号才行,所以就直接随机phone就可以了,但是他在后续的代码中把这跟手机号给设置进了redis
中
所以必须要把这跟phone
随机化来绕redis
的缓存才能进行正常注入
SSRF
这里全局搜索curl_exec(
emm感觉是这里 确实是可控的
\Application\Course\Controller\DocumentController.class.php
从逻辑上来看
$_SERVER['HTTP_AUTHORIZATION']
跟 $_SERVER['HTTP_X_OSS_PUB_KEY_URL']
这两个值都得存在 他就不会进行403的跳转 那么这两个都是我们可控的只要在header头加入即可,之后就会将我们传入的base64编码的值进行解码后给到curl进行直接curl执行
1 |
|
远程测了一下也是完全没问题的
加入后返回两百
最终也是测出了SSRF