通常情况下 导致webshell不能执行命令又三类原因:
- php.ini中使用disable_funcitons禁用了system() exec()等命令执行的函数
- 有WAF拦截
- web进程运行在rbash类受限制的shell环境下
如果是第一种则无法执行任何命令,另外两种可以执行少量命令。
在拿到的有些 webshell中,在执行命令时返回
ret=127
,这是由于disable_functions
的限制,最近有面试官问到过这个问题,但是由于很久没接触,以前大多是使用蚁剑插件绕过,在总结复现学习下bypass技巧。
Disable_functions
disable_functions 是 php.ini中的一个设置选项,可以用来设置php环境禁止使用某些函数,主要是用来禁止某些能够执行危险命令的函数

通常在拿到一个webshell 使用管理工具连接执行命令却返回
ret=127
这种就是被disable_functions 所限制了。
黑名单绕过
有些运维人员可能没有将php命令执行的函数禁用完,
1 | assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open |
利用PHP 7.4 FFI 绕过
利用条件
- Linux 操作系统
- PHP>= 7.4
- 开启了FFI拓展且 ffi.enable=true
利用原理
FFI(Foreign Function Interface),即外部函数接口,允许从用户区调用C代码。简单地说,就是一项让你在PHP里能够调用C代码的技术。
当所有的PHP命令执行的函数被禁用后,可以用过PHP7.4的新特性FFI调用C代码的方式。
先声明C中的命令执行函数「system()」,在通过FFI变量调用system() 绕过PHP中的system函数
查看FFI是否开启 ffi.enable 设置为TRUE

利用方法
使用 FFI::cdef
//创建一个新的FFI对象
通过C 的 system()
去执行命令
1 |
|
访问 ip/1.php?cmd=whoami
利用Linux环境变量 LD_PRELOAD绕过
LD_PRELOAD
LD_PRELOAD是Linux系统的一个环境变量,用于动态库的加载
一般情况下动态库的搜索顺序:
- 编译目标代码时知道的动态库搜索路径LD_PRELOAD
- 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
- 配置文件/etc/ld.so.conf中指定的动态库搜索路径
- 默认的动态库搜索路径 /lib
- 默认的动态库搜索路径 /usr/lib
LD_PRELOAD的优先级最高,因而可以影响程序运行时的链接,运行程序运行前优先加载动态链接库。
可以通过环境变量LD_PRELOAD劫持系统函数,可以达到不调用PHP的各种命令执行函数「system() exec()等」仍可执行系统命令的目的。
利用思路
1.本地伪造.c 文件劫持某个函数并生成一个动态链接库.so 文件
2.上传文件到服务器有权限的目录下
3.利用php中的putenv()设置LD_PRELOAD路径为该文件
4.配合php中某个函数去厨房构造的动态链接库 .so文件
5.执行命令
利用条件
PHP支持putenv() mail()函数 「无需安装sendmail」
文章可见 https://www.freebuf.com/web/192052.html
利用方法
项目地址: https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
该项目中有三个关键文件,bypass_disablefunc.php、bypass_disablefunc_x64.so、bypass_disablefunc_x86.so。
bypass_disablefunc.php 为命令执行 webshell,提供三个 GET 参数:
http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so
cmd参数 执行命令
outpath参数 保存命令执行输出结果的文件路径「注意 web 是否有读写权限、web 是否可跨目录访问、文件将被覆盖和删除等几点」
sopath参数 指定劫持系统函数的共享对象的绝对路径
将 bypass_disablefunc.php 和 bypass_disablefunc_x64.so 传到目标有权限的目录下,指定好三个 GET 参数后,并用include去包含bypass_disablefunc.php 即可突破 disable_functions。
利用Windows COM组件绕过
利用条件
1.Windows环境
2.开启COM组件「5.4自带 其他版本自行添加」

如果在phpinfo中 com_dotnet下 com.allow_dcom 表示COM组件开启。可以直接实例化一个COM对象,通过调用对象方法来执行系统命令以绕过disable_functions
利用方法
上传php脚本 后传参执行命令
1 |
|
利用攻击PHP-FPM
利用条件
- Linux操作系统
- PHP-FPM
- 存在可写目录 需上传.so文件
漏洞环境
https://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functions/5
git clone https://github.com/AntSwordProject/AntSword-Labs.git
cd AntSword-Labs/bypass_disable_functions/5
docker-compose up -d
利用方法
连接shell后无法执行命令

通过phpinfo 发现该主机配置了 FPM/Fastcgi

使用插件
需要先找到FPM接口地址


随后在 /var/www/html/ 目录下便新建了一个 .antproxy.php文件「ant」 连接shell后便可执行命令

利用Apache Mod CGI
利用条件
- Linux操作系统
- Apache + PHP「Apache使用 apache_mod_php」
- Apche开启 cgi和rewrite
- Web目录具有AllowOverride 权限
- 当前目录可写
关于mod_cgi
http://httpd.apache.org/docs/current/mod/mod_cgi.html
任何具有MIME类型application/x-httpd-cgi或者被cgi-script处理器处理的文件都将被作为CGI脚本对待并由服务器运行,它的输出将被返回给客户端。
可以通过两种途径使文件成为CGI脚本,一种是文件具有已由AddType指令定义的扩展名,另一种是文件位于ScriptAlias目录中。
当Apache 开启了cgi, rewrite时,可以利用.htaccess文件,临时允许一个目录可以执行cgi程序并且使得服务器将自定义的后缀解析为cgi程序,则可以在目的目录下使用.htaccess文件进行配置。
利用方法
1.在web目录下上传一个 .htaccess 文件
1 | Options +ExecCGI |
2.上传shell.ant
1 | #!/bin/sh |
直接访问 shell.ant 会报错,是因为权限问题

3.使用蚁剑直接修改权限 从0644-> 0777

再次访问即可

使用蚁剑插件的方式

点击开始后 会创建 一个新的 虚拟终端

可以直接执行命令

利用ShellShock CVE-2014-6271
利用条件
- Linux 操作系统
- putenv
- mail or error_log 不被禁用
- /bin/bash 存在 CVE-2014-6271漏洞 (bash<=4.3)/bin/sh -> /bin/bash sh默认的shell是bash
- PHP < 5.6.2
利用方法
测试是否存在该漏洞
命令行输入 env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
如果输出 vulnerable 说明存在该漏洞

1 |
|
上传该exp_cve2014-6271.php 到目标主机
包含文件即可

在蚁剑虚拟终端上已经集成了对ShellShock的利用 可以在终端上直接执行命令
利用iconv拓展
利用条件
- Linux操作系统
- putenv
- iconv
- 存在可写目录 上传.so文件
- 相比LD_PRELOAD环境下 多禁用了error_log
利用原理
1 |
|
利用GCONV_PATH环境变量 加载 .so文件并在.so文件中执行命令
具体原理分析可见 https://hugeh0ge.github.io/2019/11/04/Getting-Arbitrary-Code-Execution-from-fopen-s-2nd-Argument/
利用方法
直接使用蚁剑的插件

可以看到在 /var/www/html/目录下创建一个 .antproxy.php 的shell文件 连接后即可执行命令
References
https://blog.csdn.net/unexpectedthing/article/details/123782308
https://xz.aliyun.com/t/10057#toc-7
https://github.com/AntSwordProject/AntSword-Labs/tree/master/bypass_disable_functions/