php-fpm(绕过open_basedir,结合ssrf)

▼魔方 西西 提交于 2019-12-04 15:03:27

环境的安装->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上

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!