[后端代码审计] PHP 危险函数

前言

​ PHP(Hypertext Preprocessor)是一种开源的脚本语言,主要用于Web开发,特别是服务器端编程。是学习网络安全需要掌握的一门语言。

​ PHP 中有一些函数是比较危险的,也是进行PHP代码审计需要重点关注的内容。

函数速查:

函数
eval( )
assert( )
preg_replace( )
call_user_func( )
call_user_func_array( )
array_map( )
system( )
a ( a( a(b)
exec( )
shell_exec( )
pssthru( )
popen( )
反引号

在 PHP 开发中,一些函数虽然功能强大,但也可能带来安全风险。如果不正确使用这些函数,可能会导致代码漏洞,甚至被攻击者利用。了解这些危险函数及其安全使用方法对保护应用程序至关重要。

1. eval()

1.1 功能

eval() 函数将传递给它的符合PHP语法的字符串作为 PHP 代码执行。这使得 eval() 能动态生成和执行代码,但也带来很大的安全风险。

示例:

$code = 'echo "Hello, World!";';
eval($code); // 输出 "Hello, World!"

//一句话木马,密码为 111
eval($_REQUEST['111']);

$yjh = $_REQUEST['111'];
eval($yjh);

1.2 风险

  • 代码注入攻击: 如果 eval() 执行的代码来自用户输入,攻击者可以注入恶意代码,导致严重的安全问题,这也是一句话木马的原型

1.3 安全建议

  • 避免使用: 尽量避免使用 eval(),尤其是处理用户输入时。
  • 验证和过滤: 如果确实需要使用 eval(),请确保传递给它的字符串经过严格验证和过滤。

1.4 绕过限制

下面代码是限制代码:

$code = empty($_REQUEST['code'])?'phpinfo();':$_REQUEST['code'];
$code = addslashes($code);
eval($code);

如果参数进入eval( )之前,进行了过滤,列如过滤了单双引号,可以进行绕过:

1.使用ASCII编码

2.使用base64编码

虽然可以以函数的方式调用eval( ),但是它并不是PHP函数,而是一种语法结构,所以也就是说其不能动态调用。

eval( ) 中执行的字符串要以分号结束

下面是几种执行方式:

?code=phpinfo();
?code=${phpinfo()};
?code=dai;phpinfo();
?code=?>111<?php phpinfo();
?code=eval(phpinfo());

2.assert()

2.1 功能

assert() 函数将传递给它的字符串作为 PHP 代码执行,它是一个函数,可以动态调用,但是它只能执行一条PHP语句。

示例:

$code = $_REQUEST['code'];
assert($code);

可以使用蚁剑进行连接测试,但是在连接的时候不能使用default编码
在这里插入图片描述

2.2 风险

  • 代码注入攻击: 如果 assert() 执行的代码来自用户输入,攻击者可以注入恶意代码,导致严重的安全问题

2.3 安全建议

在高版本的PHP中,assert( )方法被弃用。

3. preg_replace()/e 修饰符

3.1 功能

preg_replace() 函数用于正则表达式替换,/e 修饰符(已在 PHP 5.5 中废弃)允许执行替换内容中的 PHP 代码。

示例(不推荐):

$pattern = '/(\d+)/e';
$replacement = 'echo $1 * 2';
$string = 'The number is 5';
$result = preg_replace($pattern, $replacement, $string);
echo $result; // 输出 "The number is 10"

3.2 风险

  • 代码执行漏洞: /e 修饰符允许执行 PHP 代码,可能导致代码注入攻击。

3.3 安全建议

  • 使用替代方案: 不要使用 /e 修饰符,使用 preg_replace_callback() 来代替。

4. call_user_func

call_user_func是一种回调函数,用于调用另外一个函数。

示例:

$func = 'assert';
$arg = "phpinfo();";

call_user_func($func,$arg); //assert(phpinfo(););

5. include, require, include_once, require_once

5.1 功能

这些函数用于引入和执行 PHP 文件。

示例:

include 'config.php';

5.2 风险

  • 本地文件包含攻击(LFI): 如果引入的文件名来自用户输入,攻击者可以通过路径遍历来包含恶意文件。

5.3 安全建议

  • 避免用户输入: 避免直接使用用户输入来构建文件路径。
  • 使用固定路径: 使用固定和受控的路径来引入文件。

6. file_get_contents()file_put_contents()

6.1 功能

  • file_get_contents() 读取文件内容。
  • file_put_contents() 将数据写入文件。

示例:

$content = file_get_contents('example.txt');
file_put_contents('example.txt', 'New content');

6.2 风险

  • 文件包含和覆盖: 如果文件路径来自用户输入,可能导致文件包含、覆盖或数据泄露。

6.3 安全建议

  • 验证路径: 验证和清理文件路径,确保路径是预期的。
  • 使用绝对路径: 使用绝对路径或相对路径,避免用户控制的路径。

7. OS命令执行函数

7.1 功能

这些函数用于执行系统命令并获取输出。

示例:

//exec 需要输出命令执行结果;只输出命令执行结果的最后一行;不支持命令中有空格
$output = exec('ls -l');
echo $output;

//shell_exec
$command = 'ls -l';
$output = shell_exec($command);
echo $output;

//system 自带输出功能;传参支持命令中有空格;自动区分系统平台
$cmd = "whoami";
system($cmd);

//passthru 自带输出功能,支持命令中有空格
$cmd = "whoami";
passthru($cmd);

//popen 返回值为文件指针
$result = popen($cmd, 'r');
echo fread($result, 1024);

//``内的内容,也会被解析成OS命令
$cmd = "whoami";
$cmd = "ipconfig";
echo "<pre>".`$cmd`;

7.2 风险

  • 命令注入攻击: 直接执行用户提供的命令可能导致命令注入攻击。

7.3 安全建议

  • 输入验证: 严格验证和清理用户输入。
  • 使用非动态命令: 尽可能避免使用这些函数执行用户控制的命令。
  • 使用白名单: 如果必须使用,确保命令和参数是经过验证和过滤的。

8. set_time_limit()

8.1 功能

设置脚本的最大执行时间。

示例:

set_time_limit(30); // 设置脚本最大执行时间为30秒

8.2 风险

  • 影响服务器性能: 不当使用可能导致脚本执行时间过长,影响服务器性能。

8.3 安全建议

  • 合理设置: 仅在必要时调整脚本执行时间,避免设置过长的时间限制。
  • 30
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值