某通用系统0day审计过程
字数 1166 2025-08-23 18:31:18
通用系统0day审计过程教学文档
1. 系统路由分析
路由结构解析
- 示例路由:
/setting.php/index/loginsetting:对应Application下的文件index:对应Setting下的Controller文件名login:对应Controller中的方法名
2. 文件上传漏洞审计
漏洞位置
Application\Admin\Controller\UploadController.class.php
漏洞分析
-
控制器继承了一个
upload控制器父类 -
实例化
UploadFile()对象并设置属性:$upload->exts = array('jpg', 'gif', 'png', 'jpeg'); -
魔术方法
__set存在问题:public function __set($name,$value){ if(isset($this->config[$name])) { $this->config[$name] = $value; } } -
配置数组
$config中不存在exts项,导致后缀检查失效:private $config = array( 'maxSize' => -1, 'supportMulti' => true, 'allowExts' => array(), // 实际控制上传后缀的配置项 // 其他配置... ); -
实际检查函数
checkExt是有效的,但由于配置未被正确设置导致绕过:private function checkExt($ext) { if(!empty($this->allowExts)) return in_array(strtolower($ext),$this->allowExts,true); return true; }
漏洞利用
- 只要存在
$upload->exts =这种形式的上传接口,就可能存在任意文件上传漏洞 - 因为
exts不会被实际设置到allowExts中,导致后缀检查被绕过
3. SQL注入漏洞审计(绕过Redis缓存)
漏洞位置
前台控制器中的特定路由
漏洞分析
-
关键变量:
$count:用于避免频繁查询$listJson:决定是否执行SQL查询
-
绕过条件:
if (!$listJson) { // 执行SQL查询 } -
绕过方法:
- 设置随机伪造的
PHPSESSID绕过$count检查 - 使用不存在的随机
phone号码绕过Redis缓存 - 因为系统会将查询过的
phone存入Redis,必须每次使用不同的随机号码
- 设置随机伪造的
漏洞利用
- 通过随机化
phone参数绕过Redis缓存 - 使系统每次都会执行SQL查询,从而进行注入
4. SSRF漏洞审计
漏洞位置
Application\Course\Controller\DocumentController.class.php
漏洞分析
-
关键检查:
if (!isset($_SERVER['HTTP_AUTHORIZATION']) || !isset($_SERVER['HTTP_X_OSS_PUB_KEY_URL'])) { // 403跳转 } -
漏洞触发:
- 当上述两个header都存在时,系统会将
HTTP_X_OSS_PUB_KEY_URL的值进行base64解码 - 然后直接通过
curl_exec()执行
- 当上述两个header都存在时,系统会将
漏洞利用
构造包含以下header的请求:
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
X-Oss-Pub-Key-Url: [base64编码的恶意URL]
示例:
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
X-Oss-Pub-Key-Url: aHR0cDovL2V4YW1wbGUuY29t
5. 总结
发现的安全问题
-
任意文件上传漏洞
- 原因:文件后缀检查配置未被正确设置
- 影响:可上传任意文件
-
SQL注入漏洞
- 原因:Redis缓存机制可被绕过
- 影响:可进行SQL注入攻击
-
SSRF漏洞
- 原因:未验证的header直接用于curl请求
- 影响:可发起内部网络请求
修复建议
-
文件上传:
- 修正
exts到allowExts的配置映射 - 加强文件类型检查
- 修正
-
SQL注入:
- 添加参数过滤
- 改进缓存机制
-
SSRF:
- 验证
X-Oss-Pub-Key-Url的URL是否合法 - 限制curl可访问的网络范围
- 验证