答案:PHP代码审计中常见注入类型包括SQL注入、命令注入、文件包含、反序列化漏洞和XSS。需通过追踪用户输入、审查敏感函数调用及上下文处理,结合预处理、输入验证与编码等措施进行防御。

在PHP代码审计中,注入检测的核心在于识别并阻止未经验证或不当处理的用户输入,被恶意利用来执行非预期的代码或命令。这不仅仅是寻找SQL语句中的漏洞,更是一个涉及数据流、执行上下文和安全边界的全面审查过程。
进行PHP代码注入检测,我通常会从几个关键维度入手。首先是数据输入点,所有来自外部的输入,无论是
$_GET
$_POST
$_COOKIE
$_REQUEST
$_SERVER
第二个是敏感函数的使用。这包括数据库查询函数(如
mysqli_query
PDO::query
PDO::exec
exec
shell_exec
system
passthru
`
include
require
file_get_contents
file_put_contents
eval
assert
create_function
我个人在审计时,会特别关注以下几个方面:
立即学习“PHP免费学习笔记(深入)”;
htmlspecialchars
mysqli_real_escape_string
escapeshellarg
prepare
execute
include
require
unserialize()
我通常会结合静态代码分析工具(如PHPStan、Psalm,或更专业的SAST工具如RIPS)进行初步扫描,它们能快速标记出潜在的敏感函数调用和数据流。但工具毕竟是工具,它们往往会有误报,也难以理解复杂的业务逻辑和上下文,所以人工审查是不可或缺的,它能帮助我深入理解代码的意图,识别那些工具难以捕捉的逻辑漏洞。
在我多年的代码审计经验中,PHP应用程序面临的注入攻击种类繁多,但最常见且危害最大的,往往集中在以下几个方面。理解这些类型,是进行有效检测的第一步。
首先,也是最广为人知的,是SQL注入(SQL Injection)。这无疑是PHP应用中最普遍的注入类型。当用户输入的数据被直接拼接到SQL查询语句中,而没有经过适当的转义或参数化处理时,攻击者就可以通过构造恶意输入,改变查询的逻辑,甚至执行任意数据库命令。这可以导致数据泄露、篡改,甚至数据库服务器的完全控制。
其次,命令注入(Command Injection)也不容忽视。PHP提供了
exec()
shell_exec()
system()
passthru()
再来是文件包含注入(File Inclusion),这包括本地文件包含(LFI)和远程文件包含(RFI)。当
include()
require()
include_once()
require_once()
对象注入(Object Injection),也称反序列化漏洞,虽然不如SQL注入那么直观,但其潜在危害同样巨大。当
unserialize()
__wakeup()
__destruct()
此外,还有跨站脚本(Cross-Site Scripting, XSS),虽然它主要影响客户端浏览器,但其根源往往在于服务器端未能正确地对用户输入进行HTML编码,导致恶意脚本被注入到网页中。这可能导致会话劫持、钓鱼攻击等。虽然不是直接的后端代码执行,但它利用了服务器对数据的处理不当。
不那么常见但依然存在的,还有如LDAP注入(当应用程序与LDAP服务器交互时)、XPath注入(在处理XML数据时)等。这些都要求我们审计时,不仅要关注最常见的漏洞,也要对整个数据流和所有外部交互点保持警惕。
识别PHP中的SQL注入漏洞,在我看来,需要一种系统性的、结合人工经验与工具辅助的方法。它远不止于“搜索
mysql_query
首先,我会从数据库交互点入手。我会查找所有与数据库进行交互的PHP函数或方法调用,例如
mysqli_query()
PDO::query()
PDO::exec()
mysql_query()
接下来,关键在于追踪用户输入。我会逆向或正向追踪所有来自
$_GET
$_POST
$_REQUEST
$_COOKIE
$_SERVER
HTTP_REFERER
USER_AGENT
一个非常明确的危险信号是字符串拼接SQL。当看到如下模式时,我就会立刻警觉:
$id = $_GET['id']; $sql = "SELECT * FROM users WHERE id = " . $id; // 危险! $result = mysqli_query($conn, $sql);
在这种情况下,如果
$_GET['id']
1 OR 1=1
SELECT * FROM users WHERE id = 1 OR 1=1
相反,我会寻找预处理语句(Prepared Statements)的使用。这是防御SQL注入最有效且推荐的方法。PDO和MySQLi都提供了这种机制:
// PDO 示例
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $id);
$stmt->execute();
// MySQLi 示例
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id); // "i" 表示整数类型
$stmt->execute();如果代码中广泛使用了预处理语句,并且参数是正确绑定的(而不是再次拼接),那么SQL注入的风险就会大大降低。但要注意,即使使用了预处理,如果参数绑定时仍然将用户输入直接拼接,或者在
ORDER BY
LIMIT
此外,我还会检查是否使用了特定的转义函数,如
mysqli_real_escape_string()
addslashes()
最后,一个容易被忽视的点是框架或ORM的使用。虽然现代框架如Laravel、Symfony等通常会默认使用预处理语句来防止SQL注入,但如果开发者绕过框架的ORM层,直接执行原生SQL查询,或者在查询构建器中使用了不当的
raw()
当然,SQL注入只是冰山一角。在PHP代码审计中,我发现很多非SQL注入的漏洞同样具有高风险,而且常常被经验不足的开发者所忽视。
首先,命令注入(Command Injection)是一个非常直接且危险的威胁。PHP提供了多种执行系统命令的函数,如
exec()
shell_exec()
system()
passthru()
`
ping
escapeshellarg()
escapeshellcmd()
其次,文件包含漏洞(File Inclusion),特别是本地文件包含(LFI)和远程文件包含(RFI)。当
include()
require()
?page=../../../../etc/passwd
basename()
allow_url_include
再者,对象注入(Object Injection),即反序列化漏洞,是近年来越来越受关注的一个点。PHP的
unserialize()
unserialize()
__wakeup()
__destruct()
代码执行注入也是一个极端危险的类别。PHP中的
eval()
assert()
create_function()
最后,HTTP头注入(HTTP Header Injection)也值得一提。当应用程序使用
header()
%0a
%0d%0a
这些非SQL注入的风险,每一个都可能导致严重的后果,因此在代码审计时,我们必须保持一个全面的视角,不仅仅盯着数据库,还要关注所有与外部交互、文件操作、命令执行以及序列化相关的代码点。
以上就是PHP代码注入检测代码审计_PHP代码审计中注入检测方法的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号