php常见敏感函数

总结

命令执行

  1. exec()
  2. system()
  3. shell_exec()
  4. passthru()
  5. preg_replace()函数 执行命令但是需要/e 模式
  6. escapeshellcmd()函数
  7. popen() 此函数需要写入一个文本当中 > D:/1.txt’, ‘r’ ); ?>
  8. proc_open()
  9. pcntl_exec() 也是写入一个文件当中 pcntl_exec( “/bin/bash” , array(“whoami”));
  10. create_funtion()主要用来创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给 create_function()执行任意命令。

string create_function(string $args , string $code )

$args 变量部分

$code 方法代码部分(要执行的代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
//用普通函数实现执行命令
function func($cmd)
{
return system($cmd);
}
func('whoami');
echo "
";

//以上函数可以用匿名函数表示
$func = create_function('$cmd','return system($cmd);');
$func ('whoami');
?>
  1. call_user_func 和 call_user_func_array 和 array_map。这三个函数都是将第一个参数当作一个方法名,第二个参数当作该方法的内部参数。不同的是第一个函数接受的回调内部参数是单个变量,而后两个函数接受的回调内部参数必须是数组类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
function callback(){
$shell=$_GET['shell'];
eval($shell);
}
@call_user_func('callback',$shell);
?>

<?php
function callback(){
$shell=$_GET['shell'];
eval($shell);
}
@call_user_func_array('callback',array($shell));
?>

<?php
function callback(){
$shell=$_GET['shell'];
eval($shell);
}
@array_map('callback',array($shell));
?>
  1. `` 反引号

代码执行

  1. eval()
  2. assert()
  3. pre_replace()当匹配模式**<font style="color:rgb(216, 59, 100);background-color:rgb(249, 242, 244) !important;">/e</font>**时,该函数会将**<font style="color:rgb(216, 59, 100);background-color:rgb(249, 242, 244) !important;">$replacement</font>**作为 php 代码执行
  4. call_user_func()

文件包含

  1. require()
  2. include()
  3. require_once()
  4. include_once()
  5. php 伪协议

文件上传

  1. request()->file()->move() request()->file()->file() thinkphp 文件上传
  2. **$_FILES** 超全局数组
  3. move_upload_file()

文件读写/创建删除

读: ****

  1. file()
  2. fgets()读取一行
  3. fgetc()读取一个
  4. file_get_content()
  5. fread()

写:

  1. fwrite()
  2. file_put_contents()

删除:

  1. unlink() 文件删除
  2. rmdir() 目录删除

创建:

  1. tempnam()创建临时文件
  2. tmofile() 创建临时文件

其他

  1. fopen() 打开或远程读取一个 url
  2. readfile() 输出一个文件
  3. rename() 重命名
  4. fputs()文件上传

目录遍历

  1. opendir()
  2. readdir()
  3. closedir()

SSRF

  1. curl_exec()
  2. file_get_contents()直接用 file_get_contents()加载 url 指向文件
  3. fopen()
  4. fsockopen(函数会使用 socket 跟服务器建立 tcp 连接,传输原始数据

sql 注入

select、insert、update、mysql_query、mysqli 等关键字。

  1. 利用 sprintf 绕过一些过滤字符的函数,例如 xxx 函数转义过滤掉了’,那么我们就可以利用 sprintf 的特性绕过过滤。sprintf()和 addslashes()(在 php 中它对单双引号,反斜杠,NULL 字符添加反斜杠)配合使用造成注入。

sprint()正常来讲当字符中%的个数大于参数的个数时必须用占位符,占位符位于 % 符号之后,由数字和 “$“ 组成。利用它把%\匹配占位符从而使单引号逃逸。

1
2
3
4
5
6
7
8
9
10
11
12
echo sprintf("select * from user where username = '%\' and 1=1#';", "admin");
//此时%\回去匹配admin字符串,但是%\只会匹配空
运行后的结果
select * from user where username = '' and 1=1#'


//对$input与$b进行了拼接
//$sql = sprintf ("SELECT * FROM t WHERE a='%s' AND b='%1$\' and 1=1#' ", 'admin' );
//很明显,这个句子里面的\是由addsashes为了转义单引号而加上的,使用%s与%1$\类匹配admin,那么admin只会出现在%s里,%1$\为空
echo $sql ;
运行后的结果
SELECT * FROM t WHERE a='admin' AND b='' and 1=1#'
  1. mysql_connect()打开一个到 Mysql 服务器的连接
  2. mysql_query() 发送一条 sql 查询(2,3 都是在 PHP5.5.0 起已废用)
  3. urldecode()二次解码

对已自动解码的参数再次调用 <font style="color:rgba(0, 0, 0, 0.85);">urldecode()</font>,可能导致安全问题。例如,攻击者可通过双重编码绕过过滤(如将 <font style="color:rgba(0, 0, 0, 0.85);">'</font> 编码为 <font style="color:rgba(0, 0, 0, 0.85);">%2527</font>,第一次自动解码为 <font style="color:rgba(0, 0, 0, 0.85);">%27</font>,二次解码为 <font style="color:rgba(0, 0, 0, 0.85);">'</font>,可能引发 SQL 注入)

  1. rawurldecode()原理同 4
  2. is_numeric()

只用它对参数进行安全处理存进数据库,且在二次使用时未处理会造成二次注入

它不会过滤十六进制的数但在 sql 中会解析十六进制的数为对应的 ASCII 字符

变量覆盖

1.extract()

从数组中将变量导入到当前的符号表。

1
2
3
4
5
6
7
8
<?php
$var="don9";
extract($_GET);
if($var == "sec"){
echo $var;
}
else echo $var;
?>

2.parse_str()把查询字符串解析到变量中

3.$$

4.import_request_variables()将 GET/POST/Cookie 变量导入到全局作用域中(相当于开启全局变量注册), 所以如果禁止了 register_globals,但又想用到一些全局变量,则可以使用该函数。

5.Register_globals=ON 时,GET 方式提交变量会直接覆盖。本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。


php常见敏感函数
https://bxhhf.github.io/2025/07/23/yuque-hexo-post/php常见敏感函数/
作者
bxhhf
发布于
2025年7月23日
许可协议