环境的安装->https://www.cnblogs.com/zaqzzz/p/11870489.html
1.nginx的畸形访问
因为安装的是php7.0,所以需要手动修改一下:(版本低的时候没有这种防护措施)
fpm里面的security.limit_extensions默认只执行.php的文件
vi /etc/php/7.0/fpm/pool.d/www.conf
把php-fpm.conf文件里面的security.limit_extensions前边的分号去掉,把值设置为空,这样就可以执行任意的文件了,也可以试试把fpm关掉。
cgi.fix_pathinfo这个参数为1的时候,访问:
ip:/*.*/.php
例如ip/1.jpg/.php
,这里1.jpg的内容是<?php phpinfo();?>
因为 1.jpg/.php
(把他看成一个整体)不存在,但是cgi.fix_pathinfo的原因,去掉/后边的参数,可以找到1.jpg,就会把jpg当作php执行。
执行图:
2. fpm未授权访问
原因:fpm的9000端口暴露在公网上,其实默认文件是只有本地才可以访问的。
vi /etc/php/7.0/fpm/pool.d/www.conf
如果你配置成这样的话:
我们现在把他配置成全ip访问后,就可以复现了。
复现脚本https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75
python3 fpm.py ip /var/www/html/index.php -c "<?php echo
whoami
; ?>"
这里选择了index.php是因为security.limit_extensions默认只允许php文件执行,如果这个配置值为空的时候,就可以返回任意文件。
python3 test.py ip /etc/passwd
这里并不会输出passwd的内容,而是输出phpinfo()的内容,在p牛博客底下问,因为不加-c参数的时候,默认执行phpinfo();exit();
,所以返回phpinfo()后就不会只需执行了。
修改代码:
成功读取文件:
还有个问题,如果security.limit_extensions只允许php文件执行,但是你爆破不出web的目录的话,也可以利用主机上任意的一个php文件(find / -name "*.php"
)。
假设根目录下存在1.php
python3 fpm.py ip /1.php -c "<?php echo
whoami
; ?>"
3.fpm未授权访问存在 open_basedir 的限制
open_basedir限制了php能访问的目录
vi /etc/php/7.0/cli/php.ini
别忘了重启
发现已经不能访问根目录了。
修改代码:作用是修改了php的参数,可访问目录是全部目录
执行,发现又可以了
4.ssrf+fpm未授权
(ssrf漏洞这里被阿里云的安全防护截胡了)
如果fpm不在外网开放,我们可以通过ssrf进行攻击(如果存在ssrf漏洞的地方)
假设存在ssrf.php
<?php function curl($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); } $url = $_GET['url']; curl($url); ?>
利用gopherus协议攻击:(脚本在github)
现在的payload是经过一次编码后的,还要继续编码一次
burp上