Node.js中includes或readFileSync能否被绕过?配置防护是否存漏洞?
Express配置文件防护的安全性分析
场景描述
服务器目录下存在admin.config、server.config等配置文件,当前使用以下Express中间件拦截含"config"的请求参数:
app.use((req, res, next) => { if([req.body, req.headers, req.query].some( (item) => item && JSON.stringify(item).includes("config") )) { return res.send("Restricted"); } next(); });
防护是否足够?
完全不足够。这个中间件的检测逻辑存在多处致命缺陷,攻击者可以通过多种方式绕过检测,进而获取目标配置文件。
具体绕过方式
1. 绕过"config"字符串检测
- 大小写混淆:
includes方法是大小写敏感的,攻击者可使用Config、CONFIG、cOnFiG等变体。若服务器运行在Windows系统(文件系统大小写不敏感),传入?file=Admin.Config即可读取目标文件,而JSON.stringify后的字符串不会触发拦截。 - 全角字符替换:用全角形式的
config替代半角"config",JSON.stringify后的字符串无法被includes("config")匹配,但部分服务器的文件系统会自动将全角字符转换为半角,从而成功读取配置文件。 - 短文件名利用(Windows环境):Windows系统支持短文件名格式,
admin.config可简写为ADMIN~1.CON,该字符串不含"config",可直接绕过检测并读取原文件。 - 编码拆分绕过:若后端参数处理支持动态拼接,可传入拆分后的字符串(如
?file=conf%2Big),JSON.stringify后显示为{"file":"conf+ig"},不包含"config";若后端逻辑会自动解析拼接,即可还原为目标文件名。
2. 路径遍历与文件系统特性利用
若服务器存在任意文件读取或路径遍历漏洞,攻击者无需直接传入"config"字符串即可获取文件:
- 符号链接跳转:在Linux环境下,攻击者可在可访问目录创建指向
admin.config的符号链接(如ln -s ../admin.config linkfile),然后请求?file=linkfile,完全避开"config"检测。 - 相对路径+文件别名:若配置文件存在备份(如
admin.conf)或其他命名变体,直接请求该别名即可,无需触发"config"关键词检测。
总结
该中间件的防护逻辑过于简单,仅依赖字符串匹配,无法应对多种绕过手段,完全无法有效阻止攻击者获取配置文件。
内容的提问来源于stack exchange,提问作者pee2pee
相关产品推荐
相关产品推荐

