前言
在如今的网络应用中,聊天机器人随处可见,无论是各类应用还是客服系统,都能看到它的身影。今天咱们就来聊聊聊天机器人的安全问题,看看怎么在测试中发现它的漏洞,甚至让它彻底没法用。我们会在安全的环境下,用故意留有漏洞的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靶场练习,能在不破坏真实系统的情况下,学会服务器端代码注入技巧。