记一次网站PHP后端应用的目录结构泄露引起的简单代码审计

记一次网站PHP后端应用的目录结构泄露引起的简单代码审计

审计发现

1. UEditor编辑器上传(核心风险点)

首先给大家奉上泄露的文件目录结构,主要就是以下几个文件

1.1 文件结构

public/static/ueditor/php/ ├── controller.php # 路由入口 ├── action_upload.php # 上传处理 ├── action_crawler.php # 远程图片抓取 ├── action_list.php # 文件列表 ├── Uploader.class.php # 核心上传类 └── config.json # 配置文件

1.2 路由入口 - 无条件包含漏洞

$action=$_GET['action'];switch($action){case'uploadimage':case'uploadscrawl':case'uploadvideo':case'uploadfile':$result=include("action_upload.php");break;case'listimage':case'listfile':$result=include("action_list.php");break;case'catchimage':$result=include("action_crawler.php");break;}


漏洞点:

没有白名单验证 $action 的值,直接包含文件,没有检查文件是否存在

即用户控制action → 无验证 → 直接include → 可能导致任意文件包含

1.3 上传处理 - 配置信任漏洞

switch(htmlspecialchars($_GET['action'])){case'uploadimage':$config=array("pathFormat"=>$CONFIG['imagePathFormat'],"maxSize"=>$CONFIG['imageMaxSize'],"allowFiles"=>$CONFIG['imageAllowFiles']);$fieldName=$CONFIG['imageFieldName'];break;case'uploadfile':default:$config=array("pathFormat"=>$CONFIG['filePathFormat'],"maxSize"=>$CONFIG['fileMaxSize'],"allowFiles"=>$CONFIG['fileAllowFiles']);$fieldName=$CONFIG['fileFieldName'];break;}


漏洞点:

1.无条件信任配置文件,不验证配置值是否合法

2.默认分支缺陷:任何未知action都走uploadfile逻辑

即配置文件被篡改 → 白名单包含危险扩展名 → 上传类允许上传危险文件

1.4 核心上传类 - 扩展名校验漏洞

privatefunctioncheckType(){returnin_array($this->getFileExt(),$this->config["allowFiles"]);}privatefunctiongetFileExt(){returnstrtolower(strrchr($this->oriName,'.'));}


漏洞点:仅检查扩展名(strrchr($name, '.')

  • 无 MIME 类型校验
  • 无 magic bytes 校验
  • 无文件内容检查
  • 客户端 JS 校验可完全绕过

即仅检查扩展名 → 可伪造扩展名 → 上传伪装文件 → Web服务器解析执行

整体攻击链分析:

步骤代码环节具体行为为什么成功
1路由入口action=uploadfile进入上传分支没有白名单验证,直接包含
2上传配置config.json读取fileAllowFiles信任配置,可能包含.jpg
3上传类-扩展名getFileExt()返回.jpgstrrchr只取最后一个点
4上传类-校验in_array('.jpg', $allowFiles)通过检查(白名单有.jpg)
5保存文件保存为shell.php;.jpg未重命名,使用原始文件名
6Web服务器Apache解析文件分号被忽略,当作PHP执行

其他上传端点

Action功能端点
uploadimage图片上传/static/ueditor/php/controller.php?action=uploadimage
uploadscrawl涂鸦上传/static/ueditor/php/controller.php?action=uploadscrawl
uploadvideo视频上传/static/ueditor/php/controller.php?action=uploadvideo
uploadfile文件上传/static/ueditor/php/controller.php?action=uploadfile
catchimage远程图片抓取/static/ueditor/php/controller.php?action=catchimage

一句话总结:

路由入口无条件信任用户输入,配置文件提供可被操纵的白名单,上传类仅做简单的扩展名检查(且提取逻辑存在缺陷),文件未重命名保存,这四个缺陷串联形成了完整的文件上传漏洞链,可上传伪装成图片的Webshell并执行任意代码。

1.5 配置文件

文件类型白名单:

类型允许扩展名
图片.png, .jpg, .jpeg, .gif, .bmp
视频.flv, .swf, .mkv, .avi, .rm, .rmvb, .mpeg, .mpg, .ogg, .ogv, .mov, .wmv, .mp4, .webm, .mp3, .wav, .mid
文件.png, .jpg, .jpeg, .gif, .bmp, .flv, .swf, .mkv, .avi, .rm, .rmvb, .mpeg, .mpg, .ogg, .ogv, .mov, .wmv, .mp4, .webm, .mp3, .wav, .mid, .rar, .zip, .tar, .gz, .7z, .bz2, .cab, .iso, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .pdf, .txt, .md, .xml

经过几番周折也是理清楚了,最后也就简单两步,上传打了个xss