php代码审计之危险函数
php代码中执行的危险函数:
call_user_func()
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。 传入call_user_func()的参数不能为引用传递
call_user_func($_GET['1'],$_GET['2']);
构造:codeexec.php?1=assert&2=phpinfo()
call_user_func_array()
第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。
call_user_func_array($_GET['1'],$_GET['2']);
构造:codeexec.php?1=assert&2[]=phpinfo()
create_function
该函数的内部实现用到了eval,所以也具有相同的安全问题。第一个参数args是后面定义函数的参数,第二个参数是函数的代码。
$a = $_GET['a'];
$b = create_function('$a',"echo $a");
$b('');
构造:codeexec.php?a=phpinfo();
array_map()
数组的每个元素应用回调函数 。其返回值为数组,array1 每个元素应用 callback函数之后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,两者必须一样。
<?php
$array = array(0,1,2,3,4,5);
array_map($_GET[1],$array);
?>
构造:codeexec.php?1=phpinfo
php执行函数:
system('ls')
shell_exec('ls')
passthru('ls')
exec('ls')
popen()
php -r '$fd=popen("whoani","r");var_dump(fgets($fd));'
proc_open()
执行一个命令并打开文件指针用于读取以及写入。
proc_get_status()
获取使用 proc_open() 所打开进程的信息。
ob_start()
bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
当调用 output_callback 时,它将收到输出缓冲区的内容作为参数 并预期返回一个新的输出缓冲区作为结果,这个新返回的输出缓冲区内容将被送到浏览器。
<?php
$cmd = 'system';
ob_start($cmd); //将命令存储到内部缓冲区
echo "$_GET[a]";
ob_end_flush(); 清除内部缓冲区,此时将输出缓冲区的内容当作参数执行并输入执行结果,即执行system($_GET(a))
?>
assert('phpinfo();')
动态代码执行,只支持php5.x,7.x里,即使参数是字符串也不执行
scandir()
列出指定路径中的文件和目录。
chgrp()
改变文件或目录所属的用户组。
chown()
改变文件或目录的所有者。
ini_set()
可用于修改、设置 PHP 环境配置参数。
ini_restore()
可用于恢复 PHP 环境配置参数到其初始值。
dl()
在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。
eval()
<?php
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
eval("\$var = $arg;");
echo "\$var =".$var;
}
?>
构造:?arg=var_dump(scandir('./')) 列出所有目录以及文件。
preg_replace()
preg_replace()函数是用于正则表达式的,但preg_replace 函数也可能会导致命令执行。
如果subject 中有 pattern 的匹配则preg_replace 的 /e 修正符会将 replacement 参数当作 php 代码,并且以 eval 函数的方式执行。
构造:?pat=/test/e&rep=phpinfo()&sub=jutst test
也可以为 ?pat=/test/e&rep=var_dump(`net user`)&sub=jutst test
create_function()
从创建一个匿名函数传递的参数,并返回一个唯一的名称
<?php
error_reporting(0);
$sort_by = $_GET['sort_by'];
$sorter = 'strnatcasecmp';
$databases=array('1234','4321');
$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
usort($databases, create_function('$a, $b', $sort_function));
?>
构造:?sort_by='"]);}phpinfo();/*
call_user_func()
<?php
$filter= 'assert';
$value = 'phpinfo()';
call_user_func($filter, $value);
?>
include(),include_once(),require(),require_once()
运行指定文件
只是整理部分,勿喷!!!!