Code前端首页关于Code前端联系我们

PHP代码安全审计:易受攻击的函数

terry 2年前 (2023-09-28) 阅读数 62 #Web安全
在PHP代码审计中,如果不使用工具并手动检查,易受攻击的函数更常见。 php代码安全审计:易出现脆弱点的函数代码执行函数eval()函数

将字符串代码作为PHP代码执行。由于 eval 函数非常危险,因此不允许用户提供未经完全验证的数据。函数

assert()

检查断言是否为 FALSE。 (执行作为 PHP 代码传递的字符串),检查语句是否为 FALSE。 assert() 检查断言,如果结果为 FALSE,则采取适当的操作。
如果断言是字符串,则使用assert()将其作为PHP代码执行。由于大多数杀毒软件都会将eval列入黑名单,因此使用assert代替eval来执行某些操作。函数

preg_replace()

preg_replace 执行正则表达式搜索和替换。 E 修饰符导致 preg_replace() 将替换参数视为 PHP 代码。

如果: pre_replace(“/test/e”,$_GET[“h”],“只是测试”);如果我们发送 ?h=phpinfo(),/e 会将 h 参数视为 PHP 代码,然后执行 phpinfo()。函数 php代码安全审计:易出现脆弱点的函数create_function()

create_function — 创建匿名函数。 php代码安全审计:易出现脆弱点的函数call_user_func() 函数

call_user_func — 使用第一个参数作为回调函数进行调用。 Function php代码安全审计:易出现脆弱点的函数call_user_func_array()

call_user_func_array — 调用回调函数,并使用数组参数作为回调函数参数。它与call_user_func()函数类似,但参数放置在数组中。 包含函数&命令执行函数 包含文件函数

require、include、require_once、include_once

包含函数一共有四个,主要功能是包含并打开指定文件。

require 和 include 几乎相同,除了处理 Failure 的方式不同。简单来说,如果需要包含错误,则会产生错误并停止运行,而如果包含错误,则只会给出警告,但程序会继续运行。后面跟“_once”的单词意味着它们只包含一次,以避免函数重定义和变量重新分配等问题。

用法:例如include include $file;
当变量$file可控时,我们可以包含任何文件,从而达到getshell的目的。
另外,不同的配置环境中可以包含不同的文件。
因此分为远程文件包含和本地文件包含。
包含的功能还可以读取任何文件的内容,这需要【支持的协议和封装协议】和【过滤器】。 php代码安全审计:易出现脆弱点的函数本地文件包含漏洞利用技术

①包含用户上传的文件(上传的一句话木马等)

②包含数据等伪协议♶♶♶♶♶♢: // in php://在 PHP 中。包含敏感文件

,例如

④ 包含日志文件(通过声明让服务器报告错误,并将带有错误信息的句子写入日志;找到日志文件的路径并包含此文件)文件;用菜刀连接;删除站点的Webshel​​l web)

对于远程包含,所需的条件是:allow_url_include 和allow_url_fopen 必须处于活动状态。如果满足条件,则可以包含url类的文件。

命令执行函数

exec() — 运行外部程序

passthru() — 运行外部程序并显示原始输出

proc_open() 并打开输入端口文件指针。

shell_exec() - 通过 shell 环境执行命令并以字符串形式返回完整输出。

system() — 运行外部程序并显示输出

popen() — 通过参数 popen() 传递命令,并执行 popen() 打开的文件

如果使用,则会执行如果可以控制命令参数,就可以执行系统命令。?
file — 将所有文件读取到数组中
fopen — 打开文件或 URL

move_uploaded_file — 将上传的文件移动到新位置
readfile — 输出文件 ♷ 重命名 file 文件或目录
rm目录— 删除目录
取消链接并删除 — 删除文件

任何文件的读、写、删除往往都是由上述函数控制的(当然还有其他函数)。
不同的功能在不同的场景下有不同的功能和不同的使用技巧。
读取:可以读取配置等文件并获取锁
写入:可以写入shellcode相关内容
删除:可以删除.lock文件并重新安装覆盖无参数 获取信息函数

array get_defined_vars ( void )
返回一个多维数组,其中包含所有已定义变量的列表,包括环境变量、服务器变量和用户定义变量。

array get_defined_constants ([ bool $categorize = false ] )
返回所有当前定义的常量名称和值。这包括由define()函数创建的那些,以及由任何扩展创建的那些。

array get_defined_functions ( void )
返回一个多维数组,其中包含所有已定义函数的列表

array get_included_files ( void ) 包括全部、所需文件名和所需文件名。

注意:前面的函数都返回一个数组。其他函数phpinfo()函数

返回有关PHP当前状态的大量信息,包括PHP编译选项、活动扩展、PHP版本、服务器信息和环境变量(如果编译为模块) 、PHP环境变量、操作系统版本信息、路径变量、配置选项的本地值和主值、HTTP标头和PHP授权信息(License)。

phpinfo() 也是一个有价值的调试工具,包含所有 EGPCS(环境、GET、POST、Cookie、服务器)数据。

软链接 - 读取文件内容

symlink bool ( string $target , string $link )
symlink() 为现有目标创建名为 link 的符号链接。

readlink — 返回符号链接指示的目标
string readlink ( string $path )
readlink() 与同名的 C 函数执行相同的操作,返回符号链接的内容。

环境变量

string getenv ( string $varname )
获取环境变量的值。

bool putenv ( string $setting )
将设置添加到服务器环境变量。环境变量仅在当前请求中存在。请求结束时环境将恢复到其原始状态。

加载扩展

bool dl ( string $library )
在运行时加载PHP扩展,并加载指定参数库的PHP扩展。

相关配置

string ini_set ( string $varname , string $newvalue )

成功时返回配置选项值。

string ini_alter ( string $varname , string $newvalue )
设置指定的配置选项值。该选项将在脚本运行时保留新值,并在脚本完成时恢复。

void ini_restore ( string $varname )
将指定的配置选项恢复为其原始值。

数值判断

bool is_numeric (mixed $var)
如果var是数字和数字字符串,则返回TRUE,否则返回FALSE。
如果只使用is_numeric判断而不进行intval转换,则可以向数据库中插入16进制字符串,从而导致二次SQL注入。

数组相关

bool in_array (mixed $needle , array $haystack [, bool $strict = FALSE ] )
在 haystack 中搜索针,如果未设置 strict,则使用宽松比较。
该函数具有在比较之前执行自动类型转换的功能。
$a = '1abc';
in_array($a,array(1,2,3)) 的返回值为 true。

变量覆盖

void parse_str ( string $str [, array &$arr ] )
如果 str 是一个查询字符串,后跟一个 URL,则将其解析为变量并将其设置为当前 Scope。

int extract ( array &$var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix = NULL ]] )
该函数用于将数组中的变量导入到当前符号表中。检查每个键名是否可以用作合法的变量名,并检查是否与符号表中现有的变量名冲突。

bool mb_parse_str ( string $encoded_string [, array &$result ] )
解析 GET/POST/COOKIE 数据并设置全局变量。由于 PHP 不提供原始 POST/COOKIE 数据,因此它目前仅适用于 GET 数据。它解析 URL 编码的数据,检测编码,将编码转换为内部编码,并将值设置为结果数组或全局变量。

bool import_request_variables ( string $types [, string $prefix ] )
将 GET/POST/Cookie 变量导入全局范围。如果您禁用了 register_globals 但仍想使用一些全局变量,则此函数非常有用。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门