php代码审计之危险函数

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

运行指定文件

只是整理部分,勿喷!!!!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值