【漏洞学习】聊天机器人安全漏洞实战:服务器端JavaScript注入探秘

前言

在如今的网络应用中,聊天机器人随处可见,无论是各类应用还是客服系统,都能看到它的身影。今天咱们就来聊聊聊天机器人的安全问题,看看怎么在测试中发现它的漏洞,甚至让它彻底没法用。我们会在安全的环境下,用故意留有漏洞的OS 2 Shop测试应用来操作。

1 探索聊天机器人与初步分析

1.1 与聊天机器人互动

打开OS 2 Shop的支持聊天功能,就能看到聊天机器人。简单和它聊几句,它会回复我们。登录后,页面还显示了一个token,不过现在先不管它,我们主要任务是找漏洞,让聊天机器人彻底失效。

1.2 查看源码找线索

动手前,先打开浏览器开发者工具的Sources面板。

搜索"chatbot"关键字,发现一些相关文件引用,其中"get chatbot status"文件挺有意思。

这个文件有处理消息、返回响应等基础功能,但我们更想知道怎么利用它找到漏洞。

2 认识服务器端JavaScript注入漏洞

2.1 漏洞原理

这次要利用的是服务器端JavaScript注入(SSJI)漏洞。简单讲,当Web应用把用户没处理过的输入,直接拼接到服务器端JavaScript解释器动态执行的字符串里,就会出现这个漏洞。它和XSS有点像,不过XSS攻击用户浏览器,SSJI能让攻击者在应用服务器上直接运行任意代码,常见于Node.js环境。

2.2 易受攻击函数

常见易受攻击的函数有eval、setTimeout等,在服务器端模板注入(SSTI)里可能见过eval,它在SSJI里也适用。还有像child process模块里的exec、spawn、fork这些系统交互函数,处理不好会导致操作系统命令注入,不过我们重点关注评估函数。

3 确认技术栈与关键函数

3.1 确定技术栈

用Wappalyzer插件查看OS 2 Shop的技术栈,发现用的是Node.js和Angular。

3.2 寻找关键函数

既然是Node.js,就找找哪些评估函数可能导致SSJI。借助AI,输入"列出Node.js中可能导致SSJI漏洞的函数",得到了一些响应。

虽然它列出了eval,但我们发现VM模块更适合演示。VM模块本是在独立上下文运行代码,类似沙箱,可攻击者能从VM上下文中逃逸回主Node.js进程。

VM模块里的runInContext、runInNewContext和Script这几个函数很关键,攻击者常利用原型链从这个"沙箱"逃逸回主进程。

4 阅读源码找注入点

4.1 源码阅读技巧

如果做渗透测试有源码权限,一定要会读源码。要是在漏洞赏金场景没源码,通过分析技术栈也能找线索。

像使用Node.js且有客服聊天功能的应用,都可以试试找这个漏洞。

4.2 定位关键文件

打开OS 2 Shop的GitHub页面,进入routes目录找到chatbot相关文件。

chatbot.ts文件里的initialize chatbot函数负责初始化聊天机器人和加载训练数据,set username函数接收用户输入并传给库函数,这个文件主要处理HTTP通信。

在应用里用开发者工具网络面板,发送消息"Hey",能看到请求JSON体和响应。这些UI交互在chatbot.ts处理,后端逻辑在另一个文件。

5 找到关键后端逻辑与构造payload

5.1 关键后端逻辑

打开index.ts文件,发现它导入了VM模块,这就给了我们逃逸"沙箱"注入payload的机会。

我们的目标是禁用聊天机器人,所以关注addUserTokenNameVoid函数里的factory.run,它把用户输入放进JavaScript模板字符串,再传给factory.run用VM模块当作实时代码执行,和eval原理一样。

5.2 构造payload

就像绕过XSS那样,通过添加引号闭合字符串来注入payload。在记事本构造payload,先设用户名为admin,闭合圆括号和分号,添加语句设process.query为null,再添加分号,调用users.addUser添加随机用户ID和用户名test。

复制payload到OS 2 Shop聊天输入框回车,成功解决"永久禁用聊天机器人"挑战,机器人对所有用户失效。

6 payload原理与总结

6.1 解释payload原理

为啥设process.query为null呢?回到chatbot.ts文件,要是bot值为null,机器人就没响应。所以我们先设它为null,又添加了新用户到数据库。

这样既禁用了聊天机器人,还注册了自己的用户。

6.2 总结

以上就是这次分享的SSJI漏洞利用实战。对Node.js安全测试或聊天机器人漏洞挖掘感兴趣的话,强烈推荐用OS 2 Shop靶场练习,能在不破坏真实系统的情况下,学会服务器端代码注入技巧。

7 视频讲解

链接:https://www.youtube.com/watch?v=ofnf1wpO3x8

相关推荐
你怎么知道我是队长26 分钟前
JavaScript 函数 this 全解
开发语言·javascript·ecmascript
不简说2 小时前
JS 代码技巧 vol.5 — 10 个错误处理套路,从 try/catch 到 Error Boundary
前端·javascript·程序员
wordpress资料库2 小时前
Next.js更适合移动开发 不适合web开发
开发语言·前端·javascript·next.js
meilindehuzi_a4 小时前
Vue 项目中的前端 BFF:跨域代理与流式请求实战
前端·javascript·vue.js
To_OC5 小时前
LC 79 单词搜索:都说这是回溯入门题,我却连错三回
javascript·算法·leetcode
胡萝卜术5 小时前
从暴力到滑动窗口的终极形态:力扣3「无重复字符的最长子串」的优化进化之路
前端·javascript·面试
c2385614 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
三84416 小时前
路由策略/控制 配置双点双向路由重发布
服务器·前端·javascript
柒和远方19 小时前
V043:BFF 层流式输出:从前端直连到生产级流式网关的架构演进
javascript·架构·node.js
用户9385156350719 小时前
SSE 流式输出的工程化拐点——为什么你需要一个 BFF 层
javascript·人工智能·全栈