时尚

php安全漏洞

时间:2010-12-5 17:23:32  作者:热点   来源:热点  查看:  评论:0
内容摘要: php安全漏洞 PHP代码里最致命的漏洞往往不是那些需要高深技巧才能触发的0day,而是程序员在写`$_GET`和`$_POST`时随手丢掉的警惕性。2019年某知名电商平台被拖库,事后排查发现攻击

php安全漏洞

PHP代码里最致命的全漏漏洞往往不是那些需要高深技巧才能触发的0day,而是全漏程序员在写`$_GET`和`$_POST`时随手丢掉的警惕性。2019年某知名电商平台被拖库,全漏事后排查发现攻击者只是全漏利用了一个看似无害的`file_get_contents($_GET['url'])`参数——那个接口本意是抓取商品图片,结果成了黑客的全漏内网扫描器。这类问题不挑框架,全漏不挑版本,全漏纯粹是全漏人在写代码时没把输入当敌人看。

SQL注入是全漏PHP的老朋友了。十年前用`mysql_query`拼接字符串的全漏时代,几乎每个新手教程都在教你加反斜杠转义,全漏但没人告诉你`gbk`编码下`%bf%27`能轻松绕过那层薄如蝉翼的全漏防护。现在PDO预编译成了标配,全漏可我还是全漏见过不少项目把变量直接塞进`->where()`的字符串参数里——预编译是安全的,但前提是全漏你别自己拆了那扇门。有个做ERP系统的朋友跟我吐槽,他们内部代码审计时发现,有个同事为了图省事,把整个查询条件用`implode(' AND ', $filters)`拼进去,那感觉就像给保险柜装了电子锁,却把备用钥匙贴在柜门上。

文件上传漏洞更是个经典陷阱。很多开发者知道要检查扩展名,却忘了`image/png`的Content-Type能被curl轻易伪造。更隐蔽的是,某些框架会解析`multipart/form-data`里的文件名,你明明过滤了`.php`,但攻击者改成`shell.php.jpg`再用Apache的`AddHandler`特性就能绕过——这种坑在Nginx+PHP-FPM的配置组合里尤其常见。我见过一个图片社交网站,上传功能只校验了文件头的前几个字节,黑客用`GIF89a`开头塞了段PHP代码,直接拿到了webshell。事后修复方案很简单:把上传目录的`execute`权限关掉,但就这么个简单操作,他们整整拖了两周才上线。

反序列化漏洞是PHP独有的暗雷。`unserialize()`函数本身没有错,错在开发者把不可信数据直接丢进去。2018年ThinkPHP的RCE漏洞就是通过构造恶意`__construct`方法链触发的,当时无数站点被打穿。这类问题的诡异之处在于,漏洞代码可能藏在某个第三方库的深层类里,你根本不知道自己的项目里哪个`__destruct`方法会被攻击者利用。有个做物联网平台的朋友,他们用`serialize`存设备状态,结果某个设备上报的字符串里带了`O:8:"stdClass":1:{ s:4:"cmd";s:4:"whoami";}`,直接让攻击者绕过了认证——后来他们改用JSON,问题立刻消失。

XSS在PHP里被低估了。很多人觉得输出转义就够了,但DOM型XSS靠前端`innerHTML`就能触发,后端过滤根本管不着。更烦人的是,PHP的`htmlspecialchars`默认不转义单引号,你得显式传`ENT_QUOTES`才行。我见过一个论坛程序,发帖时过滤了`