此 Python 脚本利用 CVE-2018-15133 漏洞,针对存在不安全反序列化漏洞的 Laravel 应用实现远程代码执行(RCE)。
该漏洞利用 Laravel(5.5.40 及更早版本,以及 5.6.0 至 5.6.29)中已加密的会话会自动反序列化且缺乏适当验证的弱点。在获取 Laravel 的 APP_KEY 后,攻击者可加密恶意负载,这些负载将被反序列化并在服务器上执行。
Laravel 使用对称加密机制处理会话,包含三个组件:
IV(初始化向量):每次会话随机生成的初始化向量
Value:使用 AES-128-CBC 或 AES-256-CBC 加密的值
MAC:基于 IV + value + APP_KEY 计算的消息认证码(HMAC-SHA256)
接收三个输入参数:Laravel 的 base64 编码 APP_KEY、要执行的命令以及目标域名
调用 PHPGGC 工具,使用 Laravel/RCE5 gadget chain 生成恶意 PHP 对象链
构造将在目标服务器上执行的操作系统命令(例如:system('whoami');)
生成包含串联 gadget 的 PHP 序列化负载
将 base64 编码的负载解码为二进制格式
处理 APP_KEY,去除可能存在的 "base64:" 前缀
补全必要的填充,使密钥成为有效的 base64
将密钥从 base64 解码为字节
生成 16 字节的随机初始化向量(IV)
使用 AES-CBC 模式,以密钥和 IV 加密负载
加密前对负载应用 PKCS7 填充
将 IV 编码为 base64
将密文(加密后的负载)编码为 base64
将 base64 编码的 IV 和 value 拼接,作为 HMAC 的消息
使用 HMAC-SHA256,以密钥作为秘密,对拼接后的消息计算 MAC
构建包含 iv、value 和 mac 三个字段的 JSON 对象
将完整 JSON 编码为 base64
使用 curl 构造 HTTP 请求,将负载放入 laravel_session cookie
将请求发送到目标域名
Laravel 服务器接收 cookie 并解码 base64
Laravel 验证 MAC 对 IV 和 value 的完整性
Laravel 使用其 APP_KEY 通过 AES-CBC 解密内容
Laravel 自动反序列化解密后的内容
PHP 调用反序列化对象的魔术方法 __destruct() 或 __wakeup()
触发 gadget chain,最终执行 call_user_func() 或 eval()
操作系统命令在服务器上执行
该漏洞利用串联 PHP 魔术方法调用的 gadget chain:
在反序列化过程中,PHP 自动调用 __destruct() 或 __wakeup(),启动链式调用,最终通过 eval() 执行任意代码。
前提条件 要使漏洞利用成功,攻击者需要:
Laravel 的 APP_KEY(通过环境变量泄露、暴露的 S3 存储桶、源代码等方式获取)
存在漏洞且默认启用反序列化的 Laravel 版本
在 ./phpggc/ 目录下安装 PHPGGC(https://github.com/ambionics/phpggc)
使用示例
python exploit.py "base64:dGhpc2lzYXNlY3JldGtleQ==" "whoami" "http://target.htb"
此命令将生成一个序列化负载,当 Laravel 反序列化该会话时执行 whoami。