6.1 文件上传与包含漏洞


6.1 文件上传与包含漏洞

本节摘要:本节讲红队把代码送进对方地盘的两条通道:文件上传功能的校验绕过(扩展名、类型头、解析差异)与文件包含、路径穿越漏洞。演示为本地靶场最小化复现,蓝队侧给出"校验、重编码、隔离、白名单"的完整整改。上传框是内网回合的第一道边门,它的安全性取决于整条处理链最弱的一环。

把行李塞进门卫室

内网回合开局,红队需要的不是漏洞而是落脚点:一段能在服务器上执行的代码。头像上传、附件中心、导入功能,这些看似无害的入口都是潜在的投递通道。文件上传漏洞的成因一句话说清:服务端保存并最终以可执行方式处理了本应只是数据的文件。攻击的关键在于让文件"看起来是图片,落地后是脚本"——这中间隔着整条校验链,任何一环判断依据不同步,就是绕过点。

文件包含则是另一条路:应用的模板或加载逻辑允许外部输入决定"要读哪个文件",攻击者让它读到不该读的(路径穿越),甚至让它把上传的文件当代码执行(包含执行)。

上传校验链与绕过点

完整的校验链有四关:前端校验(形同虚设,请求可绕开页面)、扩展名校验(黑名单天生漏项)、类型头校验(文件头可伪造)、内容解析(最终谁说了算取决于服务器的解析规则)。靶场复现经典绕过(最小化):

# 反面教材:只看扩展名黑名单的上传(靶场复现) BLOCKED_EXT = {".php", ".exe"} def upload(file): ext = file.name.rsplit(".", 1)[-1].lower() if f".{ext}" in BLOCKED_EXT: return fail("类型不允许") save(f"/var/www/uploads/{file.name}", file.read()) # 原名原样落盘 return ok(f"/uploads/{file.name}")
绕过演示(靶场实录,载荷以无害标记文件代替真实脚本): 1) avatar.php5 / avatar.phtml ← 黑名单没覆盖的等价扩展名 2) avatar.php%00.jpg ← 截断手法(旧解析环境) 3) avatar.jpg(内容为脚本) ← 扩展名与类型头都是图片,内容是代码, 再配合解析差异(下述)使其被执行 4) .htaccess 投递 ← 让目录里的 jpg 按脚本解析(特定服务器) 解析差异:目录 URL 以 /uploads/x.php/ 形式访问图片时, 旧版服务器按路径中的 php 决定解析器——文件名说了算,内容说了不算

06-01-fig01

包含与穿越:让服务器读错文件

文件包含漏洞的靶场复现:

// 反面教材:按参数决定加载哪个模板(旧系统风格,靶场复现) $page = $_GET["page"]; include("templates/" . $page); // 访问 ?page=....//....//etc/passwd ← 路径穿越:读到系统文件 // 访问 ?page=../../uploads/avatar.jpg ← 包含执行:上传物被当代码解析

成因与注入同构:结构性输入(加载哪个文件)被用户数据直接决定。整改也同构——白名单映射,外加真实路径校验:

// 整改版:白名单 + 路径归一化双保险 $ALLOWED = ["home" => "home.tpl", "about" => "about.tpl"]; $page = $ALLOWED[$_GET["page"] ?? ""] ?? "home.tpl"; // 结构输入走映射 $real = realpath("templates/" . $page); if (!str_starts_with($real, realpath("templates"))) { // 归一化后仍须在目录内 http_response_code(400); exit; } include($real);

检测与应急

检测信号集中在"上传行为的异常":同账号短时间高频上传、文件名含可执行后缀变体或空字节的尝试、上传目录出现非图片魔数文件、静态目录出现带解析参数的访问(解析差异探测的特征)。应急上,确认绕过后立即下线该上传通道、清点可疑时段的全部落地文件(按上传者与时间窗拉清单)、隔离并留样分析,再排查这些文件是否被访问过——访问记录能直接回答"有没有被执行"这个最关键的问题。

上传功能的自查口诀:白名单、重编码、随机名、隔离域、禁执行。五关全过,红队的行李就只能在门卫室里当一张真正的图片。

存量上传功能的分级整改

真实系统里往往同时存在新旧好几个上传入口,一次性全部重造不现实,按风险分级排期更可行。高危级(文件可直接通过 Web 访问):立即处理——目录禁执行权限是当天能做的动作,哪怕校验链还没改,"存得下但跑不动"就已经掐断了主要危害。中危级(上传后转存对象存储):限期补齐内容重编码与随机重命名,消除"图马混写"与路径推断两类隐患。低危级(仅内部使用、访问受控):纳入季度巡检清单,校验链缺陷登记技术债排期。分级的意义在于承认资源有限时先把"能立刻止血"的动作做完——上传漏洞最贵的不是存在,而是存在且可执行。

配套的管理动作同样重要:给每个上传入口登记 owner(谁开发谁负责整改)、把"上传目录出现可执行请求"设为常驻告警(有请求即说明有人在试探,无论成败都值得看一眼)、季度复盘上传类告警的趋势。这些运营位补上,上传这条边门才算真正上了岗。

包含与穿越一侧的存量问题常被彻底遗忘——因为它们的入口通常藏在"页面渲染""模板加载"这类正常功能里。排查思路是从代码侧反向找:全文检索"按变量拼接路径后加载文件"的模式,命中处逐个过白名单映射检查;老系统的模板加载参数尤其值得逐个过目。这类漏洞的检测信号也偏门:日志里出现访问不存在模板的报错、路径里带穿越段的请求——出现即是有人在敲门,别当噪音过滤掉。上传与包含两线合起来做一次专项排查,通常一个迭代周就能完成,是内网回合里性价比最高的存量清理动作之一。排查的交付物建议固定为两张清单:一张"上传入口台账"(入口、校验链现状、风险级、整改期限),一张"包含与穿越点台账"(代码位置、输入来源、是否白名单)。两张清单一轮排查建立、季度复审更新,它们既是整改的依据,也是下一任接手者的地图——内网防线的连续性,靠的就是这类不起眼却常新的文档。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U