主页 > 网络知识 > 绕过Disable Functions来搞事情(7)

绕过Disable Functions来搞事情(7)

既然是请求,那么SCRIPT_FILENAME就相当的重要,因为前面说过,fpm是根据这个值来执行PHP文件文件的,如果不存在,会直接返回404,所以想要利用好这个漏洞,就得找到一个已经存在的PHP文件,好在一般进行源安装PHP的时候,服务器都会附带上一些PHP文件,如果说我们没有收集到目标Web目录的信息的话,可以试试这种办法.

第二个限制

即使我们能控制SCRIPT_FILENAME,让fpm执行任意文件,也只是执行目标服务器上的文件,并不能执行我们需要其执行的文件。那要如何绕过这种限制呢?我们可以从php.ini入手。它有两个特殊选项,能够让我们去做到任意命令执行,那就是auto_prepend_file和auto_append_file。auto_prepend_file的功能是在执行目标文件之前,先包含它指定的文件。那么就有趣了,假设我们设置auto_prepend_file为php://input,那么就等于在执行任何PHP文件前都要包含一遍POST过去的内容。所以,我们只需要把待执行的代码放在POST Body中进行远程文件包含,这样就能做到任意代码执行了。

第三个限制

我们虽然可以通过远程文件包含执行任意代码,但是远程文件包含是有allow_url_include这个限制因素的,如果没有为ON的话就没有办法进行远程文件包含,那要怎么设置呢? 这里,PHP-FPM有两个可以设置PHP配置项的KEY-VALUE,即PHP_VALUE和PHP_ADMIN_VALUE,PHP_VALUE可以用来设置php.ini,PHP_ADMIN_VALUE则可以设置所有选项(disable_functions 选项除外),这样就解决问题了。

所以,我们最后最后构造的请求如下:

{ 'GATEWAY_INTERFACE': 'FastCGI/1.0', 'REQUEST_METHOD': 'GET', 'SCRIPT_FILENAME': '/var/www/html/name.php', 'SCRIPT_NAME': '/name.php', 'QUERY_STRING': '?name=alex', 'REQUEST_URI': '/name.php?name=alex', 'DOCUMENT_ROOT': '/var/www/html', 'SERVER_SOFTWARE': 'php/fcgiclient', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_PORT': '6666', 'SERVER_ADDR': '127.0.0.1', 'SERVER_PORT': '80', 'SERVER_NAME': "localhost", 'SERVER_PROTOCOL': 'HTTP/1.1' 'PHP_VALUE': 'auto_prepend_file = php://input', 'PHP_ADMIN_VALUE': 'allow_url_include = On' }

该请求设置了auto_prepend_file = php://input且allow_url_include = On,然后将我们需要执行的代码放在Body中,即可执行任意代码了。

这里附上P神的EXP:https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75

利用方法

我们利用 AntSword-Labs项目来搭建环境:

git clone https://github.com/AntSwordProject/AntSword-Labs.git cd AntSword-Labs/bypass_disable_functions/5 docker-compose up -d

搭建完成后访问 :18080:

 

image-20210211135711659

 

拿下shell后发现无法执行命令:

 

image-20210211135615616

 

查看phpinfo发现设置了disable_functions,并且,我们发现目标主机配置了FPM/Fastcgi:

 

image-20210211152332033

 

我们便可以通过PHP-FPM绕过disable_functions来执行命令。

在蚁剑中有该通过PHP-FPM模式绕过disable_functions的插件:

 

image-20210211152949460

 

注意该模式下需要选择 PHP-FPM 的接口地址,需要自行找配置文件查 FPM 接口地址,默认的是unix:///本地 Socket 这种的,如果配置成 TCP 的默认是127.0.0.1:9000。

我们本例中PHP-FPM 的接口地址,发现是127.0.0.1:9000:

 

image-20210211153315812

 

所以在此处选择127.0.0.1:9000:

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!