漏洞参考文档:https://github.com/DepthFirstDisclosures/Nginx-Rift
触发条件
先明确漏洞触发必备3个条件(缺一不可)
- 一条rewrite后面紧跟着另一条rewrite/if/set指令;
- 前一条 rewrite 用了匿名捕获组1 2 $3...;
- rewrite 替换字符串里包含问号?。
有问题举例:
条件1:
powershell
rewrite ^/(.*)$ /api/$1?a=1;
set $test 1; # 紧跟,触发条件1
条件2:
powershell
# 第一条重写用了 $1 $2 这种匿名取值
# 就是正则里用了小括号 () 抓内容,后面用 $1 拿出来用。
rewrite ^/(user)/(.*)$ /$1/$2
条件3:
powershell
# 重写 携带了?
rewrite ^/(.*)$ /api/$1?a=1;
快速自查 & 修复
- 检查配置里有没有连续 rewrite+rewrite/if/set
- 重写里别用 1 2,改用命名捕获组
- 重写 URL 里尽量避免直接带 ?