PHP漏洞
2019年,某安全团队在GitHub上爬取了超过五万个PHP项目,其中43%存在至少一个高危漏洞。这个数字不是危言耸听,它来自一份真实的安全报告。PHP至今仍驱动着全球78%的网站后端,从WordPress到Wikipedia,从电商系统到政府门户。攻击者盯着它,就像狼群盯着一片羊圈。
最常见的漏洞类型是SQL注入。问题出在开发者把用户输入直接拼进查询语句里。比如登录框,你输入 ' OR '1'='1,如果后端用 SELECT * FROM users WHERE name='$name' AND pass='$pass',那这条语句会直接绕过密码验证。我见过一个真实案例:某小型CMS系统,登录处过滤了单引号,但没过滤双引号,攻击者用 admin" -- 就拿到了后台权限。这种漏洞2003年就写进了OWASP Top 10,二十年后依然每天都有新站中招。
文件包含漏洞更隐蔽。PHP的 include 和 require 允许动态路径,当路径参数可控时,攻击者可以读取 /etc/passwd 甚至远程加载恶意脚本。2018年,某国产OA系统爆出 ?module=../../../../etc/passwd%00 的利用方式。那个 %00 截断技巧在PHP 5.3之后被修复了,但很多老系统还在跑5.2版本。你无法想象有多少台服务器上还挂着十年前的代码。
反序列化是另一个重灾区。PHP的 unserialize() 函数如果处理了用户可控数据,攻击者可以构造恶意对象,触发 __destruct 或 __wakeup 魔术方法,进而执行任意代码。Laravel框架在2018年就出过这样的漏洞,CVE编号是2018-15133。当时攻击者只需要在请求头里带上一个特殊的序列化字符串,就能拿到服务器权限。框架团队紧急发了补丁,但大量项目没有及时更新。
还有文件上传。开发者只检查了 Content-Type,攻击者把 shell.php 改成 shell.jpg 再伪造MIME类型,服务端就放行了。更粗暴的:直接上传 shell.php%00.jpg,利用空字节截断绕过黑名单。我测试过一个开源商城系统,上传接口只判断后缀名是否在白名单里,但白名单里居然有 phtml 和 php5。这种配置错误比漏洞本身更致命。
XSS和CSRF在PHP项目里同样泛滥。输出到HTML时没有用 htmlspecialchars(),用户输入的 就被浏览器执行了。CSRF则是表单没有token验证,攻击者诱导管理员点击一个链接,就能悄悄添加一个后台账户。这些漏洞的技术门槛极低,一个刚学PHP两周的人都能写出来。
防御手段其实不复杂。用PDO预处理语句处理所有数据库查询,对文件包含路径做白名单校验,禁用 unserialize() 处理用户输入,上传文件重命名并剥离执行权限,输出时统一转义。但现实是,很多开发者觉得“我的站小,没人会攻击”。2017年,一个日活不到500的论坛被拖库,原因是管理员密码是 admin123,后台登录处存在SQL注入。攻击者只用了三分钟就拿到了全部用户数据。
PHP本身不差。差的是写PHP的人对安全的漠视。语言提供了 password_hash() 和 filter_var() 这些工具,但很多人还在用 md5($pass) 和 $_REQUEST['id']。漏洞不是PHP的错,是开发习惯的错。你写代码时少一次转义,攻击者就多一把钥匙。









