首页 » 网站建设 » php怎么关技巧_提权之disable_functions二

php怎么关技巧_提权之disable_functions二

访客 2024-11-22 0

扫一扫用手机浏览

文章目录 [+]

该方法利用的是bash中的⼀个老漏洞Bash Shellshock破壳漏洞,该漏洞的成因是Bash利用的环境变量是通过函数名称来调用的,导致该漏洞涌现因此(){开头定义的环境变量在命令ENV中解析成函数后,Bash实行并未退出,而是连续解析并实行shell命令。
而核心的缘故原由在于输入的过滤中没有严格限定边界,也没有做出合法化的参数判断⼀般函数体内的代码不会被实行,但破壳漏洞会缺点的将{}花括号外的命令进行实行PHP里的某些函数(例如:mail()、 imap_mail())能调用popen或其他能够派生bash子进程的函数,可以通过这些函数来触发破壳漏洞(CVE-2014-6271)实行命令。

利用

php怎么关技巧_提权之disable_functions二

docker-compose up -d 考试测验利用system命令失落败,Ant虚拟终端已经完成了对shellshock的利用,直接实行命令:

php怎么关技巧_提权之disable_functions二
(图片来自网络侵删)

或者手动上传文件到/var/tmp目录:

利用include函数包含利用:

bypass Apache Mod CGI

利用条件

Linux操作系统Apache + php apache利用apache_mod_php Apache开启了cgirewrite Web目录给了AllowOverride权限当前目录可写

事理

早期的Web做事器,只能相应浏览器发来的HTTP静态资源的要求,并将存储在做事器中的静态资源返回给浏览器。
随着Web技能的发展,逐渐涌现了动态技能,但是Web做事器并不能够直接运行动态脚本,为理解决Web做事器与外部运用程序(CGI程序)之间数据互通,于是涌现了CGI(Common Gateway Interface)通用网关接口。

大略理解,可以认为CGI是Web做事器和运行在其上的运用程序进行“互换”的⼀种约定。
当碰着动态脚本要求时,Web做事器主进程就会Fork创建出⼀个新的进程来启动CGI程序,运行外部C程序或Perl、PHP脚本等,也便是将动态脚本交给CGI程序来处理。

启动CGI程序须要⼀个过程,如读取配置文件、加载扩展等。
当CGI程序启动后会去解析动态脚本,然后将结果返回给Web做事器,末了由Web做事器将结果返回给客户端,之前Fork出来的进程也随之关闭。
这样,每次用户要求动态脚本,Web做事器都要重新Fork创建⼀个新进程去启动CGI程序,由CGI程序来处理动态脚本,处理完成后进程随之关闭,其效率是非常低下的。
而对付Mod CGI,Web做事器可以内置Perl阐明器或PHP阐明器。
也便是说将这些阐明器做成模块的办法,Web做事器会在启动的时候就启动这些阐明器。
当有新的动态要求进来时,Web做事器便是自己解析这些动态脚本,省得重新Fork⼀个进程,效率提高了。
任何具有MIME类型application/x-httpd-cgi或者被cgi-script处理器处理的文件都将被作为CGI脚本对待并由做事器运行,它的输出将被返回给客户端。

可以通过两种路子使文件成为CGI脚本,⼀种是文件具有已由AddType指令定义的扩展名,另⼀种是文件位于 ScriptAlias目录中。
Apache在配置开启CGI后可以用ScriptAlias指令指定⼀个目录,指定的目录下面便可以存放可实行的CGI程序。
若是想临时许可⼀个目录可以实行CGI程序并且使得做事器将自定义的后缀解析为CGI程序实行,则可以在目的目录下利用htaccess文件进行配置,如下:

Options + ExecCGI

AddHandler cgi-script .文件名

这样便会将当前目录下所有的.huahua文件当做CGI程序实行了。
由于CGI程序可以实行命令,那我们可以利用CGI来实行系统命令绕过disable_functions。

利用方法

创建.htaccess文件 (须要在其Linux环境下创建 由于编码问题);创建shell.hua文件(须要在其Linux环境下创建 由于编码问题)。

#!/bin/sh echo Content-type:text/html echo"" echo&&whoami

上传完成后,利用chmod(’shell.huahua’,0777);添加实行权限,然后访问shell.huahua 成功实行。

bypass PHP-FPM

Linux操作系统 PHP-FPM 存在可写的目录,须要上传.so文件。

既然是利用PHP-FPM,我们首先须要理解⼀下什么是PHP-FPM,研究过apache或者nginx的人都知道,早期的Web做事器卖力处理全部要求,其吸收到要求,读取文件,然后传输过去。
换句话说,早期的Web做事器只处理Html等静态Web资源。
但是随着技能发展,涌现了像PHP等动态措辞来丰富Web,形成动态Web资源,这时Web做事器就处理不明晰,那就交给PHP阐明器来处理吧!
交给PHP阐明器处理很好,但是,PHP阐明器该如何与Web做事器进行通信呢?为理解决不同的措辞阐明器(如php、 python阐明器)与Web做事器的通信,于是涌现了CGI协议。
只要你按照CGI协议去编写程序,就能实现措辞阐明器与Web做事器的通信。
如PHP-CGI程序。
实在,在上⼀节中我们已经理解了CGI以及Apache Mod CGI方面的知识了,下面我们再来连续补充⼀下 !

1)Fast-CGI

有了CGI,自然就办理了Web做事器与PHP阐明器的通信问题,但是Web做事器有⼀个问题,便是它每收到⼀个要求,都会去Fork⼀ 个CGI进程,要求结束再kill掉这个进程,这样会很摧残浪费蹂躏资源。
于是,便涌现了CGI的改良版本——Fast-CGI。
Fast-CGI每次处理完要求后,不会kill掉这个进程,而是保留这个进程,使这个进程可以⼀次处理多个要求(把稳与另⼀个Apache Mod CGI差异),这样就会大大的提高效率。

2)Fast-CGI Record

CGI/Fastcgi实在是⼀个通信协议,和HTTP协议⼀样,都是进行数据交流的⼀个通道。
HTTP协议是浏览器和做事器中间件进行数据交流的协议,浏览器将HTTP头和HTTP体用某个规则组装成数据包,以TCP的办法发送到做事器中间件,做事器中间件按照规则将数据包解码,并按哀求拿到用户须要的数据,再以HTTP协议的规则打包返回给做事器。
类比HTTP协议来说,CGI协议是Web做事器和解释器进行数据交流的协议,它由多条record组成,每⼀条record都和HTTP⼀样,也由header和body组成,Web做事器将这二者按照CGI规则封装好发送给阐明器,阐明器解码之后拿到详细数据进行操作,得到结果之后再次封装好返回给Web做事器。
和HTTP头不同,record的header头部固定的是8个字节,body是由头中的contentLength指定,其构造如下:

3)PHP-FPM

前面说了那么多了,那PHP-FPM到底是个什么东西呢? 实在FPM便是Fastcgi的协议解析器,Web做事器利用CGI协议封装好用户的要求发送给谁呢? 实在便是发送给FPM。
FPM按照CGI的协议将TCP流解析成真正的数据。

举个例子,用户访问 http://127.0.0.1/index.php?a=1&b=2 时,如果web目录是 /var/www/html ,那么Nginx会将这个要求变成如下key-value对:

这个数组实在便是PHP中 $_SERVER 数组的⼀部分,也便是PHP里的环境变量。
但环境变量的浸染不仅是添补 $_SERVER 数组,也是见告fpm:“我要实行哪个PHP文件”。
PHP-FPM拿到Fastcgi的数据包后,进行解析,得到上述这些环境变量。
然后,实行SCRIPT_FILENAME 的值指向的PHP文件,也便是 /var/www/html/index.php 。

如何攻击

这里由于FPM默认监听的是9000端口,我们就可以绕过Web做事器,直接布局Fastcgi协议,和fpm进行通信。
于是就有了利用Webshell直接与FPM通信来绕过disable functions的姿势。
由于前面我们理解了协议事理和内容,接下来便是利用CGI协议封装要求,通过Socket来直接与FPM通信。
但是能够布局Fastcgi,就能实行任意PHP代码吗?答案是肯定的,但是条件是我们须冲要破几个限定:

第⼀个限定

既然是要求,那么 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 选项除外),这样就办理问题了。
以是,我们末了布局的要求如下:

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

利用方法

做事器配置了FPM/Fastcgi

直策应用蚁剑中的bypass disablefunc插件

须要配置FPM/FCGI地址默认为unix://本地Socket ,但如果配置成TCP默认是127.0.0.1:9000

以是此处选127.0.0.1:9000

小结

绕过disable_function这是一个非常令人头疼的问题,详细表示在已经拿到了webshell,如果进一步攻击,个中也可能会碰着一些汇编等底层知识,这就须要更加深入且细致的研究。

标签:

相关文章