【漏洞学习】聊天机器人安全漏洞实战:服务器端JavaScript注入探秘
为啥设process.query为null呢?回到chatbot.ts文件,要是bot值为null,机器人就没响应。所以我们先设它为null,又添加了新用户到数据库。这样既禁用了聊天机器人,还注册了自己的用户。以上就是这次分享的SSJI漏洞利用实战。对Node.js安全测试或聊天机器人漏洞挖掘感兴趣的话,强烈推荐用OS 2 Shop靶场练习,能在不破坏真实系统的情况下,学会服务器端代码注入技巧。原
前言
在如今的网络应用中,聊天机器人随处可见,无论是各类应用还是客服系统,都能看到它的身影。今天咱们就来聊聊聊天机器人的安全问题,看看怎么在测试中发现它的漏洞,甚至让它彻底没法用。我们会在安全的环境下,用故意留有漏洞的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
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)