问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
某通用系统0day审计过程
渗透测试
转载
某通用系统0day审计过程 ============= 前言 == 本篇文章首发在先知社区 作者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()`对象然后给他的属性赋值 重点关注以下代码 ```php $upload->exts = array('jpg', 'gif', 'png', 'jpeg'); // 设置附件上传类型 ``` 发现这里会调用`UploadFile()`的魔术方法 跟进 ```php public function __set($name,$value){ if(isset($this->config[$name])) { $this->config[$name] = $value; } } ``` 这里其实就是问题的本身,要是传进来的在config里头不存在则返回空,那么我们去看一下config的设置 ```php private $config = array( 'maxSize' => -1, // 上传文件的最大值 'supportMulti' => true, // 是否支持多文件上传 'allowExts' => array(), // 允许上传的文件后缀 留空不作后缀检查 'allowTypes' => array(), // 允许上传的文件类型 留空不做检查 'thumb' => false, // 使用对上传图片进行缩略图处理 'imageClassPath' => 'ORG.Util.Image', // 图库类包路径 'thumbMaxWidth' => '',// 缩略图最大宽度 'thumbMaxHeight' => '',// 缩略图最大高度 'thumbPrefix' => 'thumb_',// 缩略图前缀 'thumbSuffix' => '', 'thumbPath' => '',// 缩略图保存路径 'thumbFile' => '',// 缩略图文件名 'thumbExt' => '',// 缩略图扩展名 'thumbRemoveOrigin' => false,// 是否移除原图 'thumbType' => 0, // 缩略图生成方式 1 按设置大小截取 0 按原图等比例缩略 'zipImages' => false,// 压缩图片文件上传 'autoSub' => false,// 启用子目录保存文件 'subType' => 'hash',// 子目录创建方式 可以使用hash date custom 'subDir' => '', // 子目录名称 subType为custom方式后有效 'dateFormat' => 'Ymd', 'hashLevel' => 1, // hash的目录层次 'savePath' => '',// 上传文件保存路径 'autoCheck' => true, // 是否自动检查附件 'uploadReplace' => false,// 存在同名是否覆盖 'saveRule' => 'uniqid',// 上传文件命名规则 'hashType' => 'md5_file',// 上传文件Hash规则函数名 ); ``` emmm根本没有 `exts` 所以说后缀根本没有检测,可以从从调用的upload中查看 断到一个叫自动检查附件  步进一下进入check函数存在检查文件类型  再次跟进一下checkExt发现是一个很强的校验白名单 ```php private function checkExt($ext) { if(!empty($this->allowExts)) return in_array(strtolower($ext),$this->allowExts,true); return true; } ``` 但是重点是他并没有赋值进去  在这进行反向验证,讲前面的属性修改为在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执行 ```xml Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l X-Oss-Pub-Key-Url: aHR0cDovL2RxM2JlMC5kbnNsb2cuY24= ``` 远程测了一下也是完全没问题的  加入后返回两百  最终也是测出了SSRF 
发表于 2024-04-19 10:24:32
阅读 ( 4433 )
分类:
代码审计
1 推荐
收藏
0 条评论
请先
登录
后评论
Zacky
16 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!