CVE-2019-11043 Nginx PHP 远程代码执行漏洞复现----自我学习

发现于Nginx+php-fpm配置下,特定条件下存在远程代码执行漏洞。当fastcgi_split_path_info处理含有%0a的请求时,因PATH_INFO为空,php-fpm逻辑缺陷允许攻击者执行远程代码。

漏洞简介:

来自Wallarm的安全研究员Andrew Danau在9月14-16号举办的Real World CTF中,意外的向服务器发送%0a(换行符)时,服务器返回异常信息。由此发现了这个0day漏洞,9月26日,PHP官方发布漏洞通告,其中指出,使用Nginx+php-fpm的服务器,在部分配置下,存在远程代码执行漏洞。并且该配置已被广泛使用,危害较大

漏洞概述:

Nginx上fastcgi_split_path_info在处理带有%0a的请求时,会因为遇到换行符\n导致PATH_INFO为空。而php-fpm在处理PATH_INFO为空的情况下,存在逻辑缺陷,攻击者通过精心构造和利用,可以导致远程代码执行。

漏洞影响版本:

Nginx+php-fpm的服务器,在使用如下配置的情况下,都有可能存在远程代码执行的漏洞

location ~ [^/]\.php(/|$) {
  ...
  fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  fastcgi_param PATH_INFO       $fastcgi_path_info;
  fastcgi_pass   php:9000;
  ...
    }

漏洞复现:

使用vulhub启动环境:

github下载漏洞环境

git clone https://github.com/vulhub/vuhub/tree/master/php/CVE-2019-111043

POC下载:https://github.com/neex/phuip-fpizdam 

POC需要go语言编译,需要go语言环境(linux下go语言安装

漏洞启动后,访问http://yuo ip:8080/index.php即可查看到一个默认页面

现在编译POC,进入下载好的poc文件夹内,执行go build进行编译,编译好后,文件内出现phuip-fpizdam可执行文件

如果编译失败,显示timeout,则需要设置代理,执行以下语句添加环境变量:

export GOPROXY=https://goproxy.io

使用编译好的工具,发送数据包:

这里已经成功执行,访问http://ip:8080/index.php?a=whoami  即可查看到命令已经成功执行。

注意:因为php-fpm会启动多个子进程,在访问index.php?a=id时需要多访问几次,以访问被污染的进程

漏洞修复方式:

1.在不影响正常业务的情况下,删除Nginx配置文件中如下配置:

fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_paramPATH_INFO       $fastcgi_path_info;

2.官网下载最新补丁

### CVE-2023-7130 漏洞概述与复现步骤 CVE-2023-7130 是一个与 PHP 的 `serialize` 和 `unserialize` 函数相关的漏洞,主要影响使用了某些特定类的 PHP 应用程序。此漏洞可能导致远程代码执行(RCE),攻击者可以通过构造恶意的序列化数据来触发漏洞[^4]。 以下是 CVE-2023-7130 的复现步骤: #### 环境准备 为了复现漏洞,需要搭建一个支持 PHP 的测试环境,并确保目标应用程序中存在可利用的类和方法。 1. 安装 PHP 环境:确保 PHP 版本符合漏洞影响范围(例如 PHP 8.1 或更低版本)。 2. 配置 Web 服务器:可以使用 Apache 或 Nginx,并将目标 PHP 文件部署到服务器根目录。 3. 目标代码示例: ```php <?php class VulnerableClass { public $command; function __destruct() { if ($this->command) { system($this->command); // 危险操作 } } } if (isset($_GET['data'])) { $data = $_GET['data']; unserialize($data); } ?> ``` 上述代码中,`VulnerableClass` 类的 `__destruct` 方法会执行系统命令,而 `unserialize` 函数直接处理用户输入的数据,这为攻击者提供了利用点。 #### 构造恶意序列化数据 攻击者可以通过构造恶意的序列化字符串来触发漏洞。以下是一个示例: ```php O:14:"VulnerableClass":1:{s:7:"command";s:15:"echo 'PWNED' > /tmp/pwned";} ``` 将此序列化字符串通过 URL 参数传递给目标脚本: ``` http://localhost/vulnerable.php?data=O:14:"VulnerableClass":1:{s:7:"command";s:15:"echo 'PWNED' > /tmp/pwned";} ``` #### 验证漏洞 如果漏洞成功触发,目标服务器上将生成一个名为 `/tmp/pwned` 的文件,内容为 `PWNED`。这表明攻击者已成功执行了任意命令。 --- ### 防御措施 为了避免此类漏洞的影响,建议采取以下防御措施: 1. **禁用危险函数**:避免在代码中直接使用 `system`、`exec` 等危险函数。 2. **输入验证**:对所有用户输入进行严格验证,尤其是传递给 `unserialize` 的数据。 3. **使用安全替代方案**:推荐使用 JSON 格式代替 PHP 的序列化机制,以减少潜在风险。 4. **更新 PHP 版本**:确保使用的 PHP 版本已修复相关漏洞[^5]。 --- ### 注意事项 在复现漏洞时,请务必遵守相关法律法规,仅在授权环境下进行测试。未经授权的渗透测试或漏洞利用行为可能触犯法律。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值