nodejs multer的安全问题分析

昨天备份本博客的时候发现,上传目录下多了几个奇怪的.asp和.php文件。这些文件并非我自己上传的,很可能是通过某个漏洞传到了服务器上。这会有什么危害呢?下面简单介绍一下。

假设某人把一个功能为删除站点下所有文件的evil.php通过漏洞传到了http://abc.com/upload/下,然后访问http://abc.com/upload/evil.php,那么:

如果该站点不支持php脚本,是没什么危害的;
如果该站点支持php脚本,它的全部文件就会被删除。
这里有两个关键点,一是主动访问该文件才会触发脚本执行,二是服务器支持该类型脚本才能执行。而本博客刚好不具备这两个条件(后面再详细说明),所以没有造成任何损失。即便如此,这漏洞还是要修复的,不然被无休止地上传文件迟早会占满硬盘空间。

本博客基于express框架开发,上传功能是通过multer中间件实现的,且只有管理后台存在文件上传的功能。因为后台页面、接口都设有权限验证,是不可能被绕过的。最后发现问题出在multer的调用上,而这问题又要归咎于官方文档的错误引导了:

app.use(multer({
    dest: './uploads/',
    rename: function (fieldname, filename) {
        return filename.replace(/\W+/g, '-').toLowerCase() + Date.now()
    }
}))
app.use(multer({
    dest: './public/upload/',
    rename: function () {
        var now = new Date();
        // 重命名为 年+月+日+时+分+秒+5位随机数
        return now.getFullYear() +
            ( '0' + (now.getMonth() + 1) ).slice(-2) +
            ( '0' + now.getDate() ).slice(-2) +
            ( '0' + now.getHours() ).slice(-2) +
            ( '0' + now.getMinutes() ).slice(-2) +
            ( '0' + now.getSeconds() ).slice(-2) +
            parseInt(10000 + Math.random() * 90000);
    }
}))

上面第一段代码为官方文档的示例,第二段代码是我在博客程序中的调用方法。而这样写就意味着所有http访问(包括404的访问)都会经过multer这个中间件。所以只要某个http访问中包含文件,该文件就会被multer保存到指定目录(dest)下。

安全的用法应该是,只对指定路径调用multer中间件,并且增加权限验证:

// 权限检查
function addPermissionChecking(handler) {
    return function(req, res, next) {
        // 假设用户信息保存在req.currentUser中
        if (req.currentUser) {
            handler.apply(this, arguments);
        } else {
            next('权限不足');
        }
    };
}

app.use(
    '/upload',
    addPermissionChecking(
        multer({
            dest: './public/upload/',
            rename: function () {
                var now = new Date();
                // 重命名为 年+月+日+时+分+秒+5位随机数
                return now.getFullYear() +
                    ( '0' + (now.getMonth() + 1) ).slice(-2) +
                    ( '0' + now.getDate() ).slice(-2) +
                    ( '0' + now.getHours() ).slice(-2) +
                    ( '0' + now.getMinutes() ).slice(-2) +
                    ( '0' + now.getSeconds() ).slice(-2) +
                    parseInt(10000 + Math.random() * 90000);
            }
        })
    )
);
就这样,问题解决了。最后再解释一下为什么本博客没有受到脚本文件的影响:

上传的文件经过重命名,且新文件名中包含随机数,也就是说攻击者就算上传了脚本文件也无法获知文件名,也就不知道访问路径;
在express中压根儿不支持ASP和PHP。

时间: 2024-10-12 17:52:06

nodejs multer的安全问题分析的相关文章

PGP的安全问题分析

PGP本身就是一个数据安全产品,它会有什么安全性问题呢?PGP的作者PhilZimmermann在PGP文档中说到:"没有哪个数据安全系统是牢不可破的."PGP也不例外.我们研究它的安全漏洞就是为了让用户知道哪些事会降低PGP的安全性,以及如何避免它们.下面是这些漏洞:口令或私匙的泄密.公匙被篡改.你删除的文件被人恢复.病毒和特洛伊木马.物理安全受到侵犯(物理安全指计算机等物理资源的安全).电磁泄露.暴露在多用户系统中.网络数据流分析,甚至会有可能被直接从密码学分析的角度被解密(这当然

浏览器安全问题分析

事端 – 安全漏洞穿透用户桌面 2009年2月,微软发布了广受关注的MS09-002安全漏洞公告,并随之马上提供了针对该漏洞的更新补丁.当访问者使用IE 7浏览器访问特定规格的网页时,MS09-002漏洞会允许远程恶意代码执行,从而破坏访问者的计算机系统.这一问题的典型性在于,面向浏览器的恶意攻击已经成为过去一年当中增长最为迅猛的一类桌面安全威胁.同时,在该威胁发布后的,各大防病毒产品厂商都截获了大量基于该漏洞的攻击.甚至一些以前流行过的恶意软件,都开始集成针对MS09-002的攻击机制生成新变

智能硬件设备八大安全问题分析

目前,IoT 技术还处于起步阶段,与金融.电子商务等其他行业相比,安全性尚未得到充分理解和明确定义.开发一款IoT 产品时,不论是像可穿戴设备这样的小型产品,还是像油田传感器网络或全球配送作业这样的大型IoT部署,从一开始就必须考虑到安全问题.要了解安全的问题所在,就需要了解IoT 设备的攻击方法,通过研究攻击方法提高IoT产品的防御能力. 作为国内最早从事智能硬件安全攻防研究的团队,基于长期的智能硬件安全攻防实践,360攻防实验室对智能硬件设备的安全隐患进行了系统的分析和梳理,总结了智能硬件设

轻松创建nodejs服务器(2):nodejs服务器的构成分析_node.js

紧接上一节,我们来分析一下代码: 第一行请求(require)Node.js自带的 http 模块,并且把它赋值给 http 变量. 接下来我们调用http模块提供的函数: createServer . 这个函数会返回一个对象,这个对象有一个叫做 listen 的方法,这个方法有一个数值参数,指定这个HTTP服务器监听的端口号. 为了提高可读性,我们来改一下这段代码. 原来的代码: 复制代码 代码如下: var http = require("http"); http.createSe

百度浏览器的隐私安全问题分析

主要发现 百度浏览器是微软和安卓平台上的一种网络浏览器,个人用户在向服务器传输数据时进行加密,就算加密了也很容易被解密.浏览器更新时可能很轻易地被中间攻击者利用,执行任意代码. 安卓版本的百度浏览器传输的个人可识别数据,包括用户的GPS坐标.搜索内容和访问时的URL,这些内容都是没有进行加密的.不仅如此,在传输用户的IMEI和附近无线网络列表时也只是使用了简单.易于破解的加密. Windows版的百度浏览器在传输个人可识别数据点的时候也没有进行加密,或者是进行了简单的加密.这些数据包括了用户的搜

关于asp+access的安全问题分析_应用技巧

众所周知,asp+access最大的安全隐患在于access数据库可以被别人    下载,而现在提供的很多asp空间都是只支持access数据库,这样一来,    asp+access的安全问题就显得很突出了.    1.Access数据库的存储隐患    在ASP+Access应用系统中,如果获得或者猜到Access数据库的存储路    径和数据库名,则该数据库就可以被下载到本地.    2.Access数据库的解密隐患    由于Access数据库的加密机制非常简单,所以即使数据库设置了密码

WebSocket通信协议应用安全问题分析

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.WebSocket通信协议于2011年被IETF定为标准RFC 6455,WebSocket API也被W3C定为标准,主流的浏览器都已经支持WebSocket通信. WebSocket协议是基于TCP协议上的独立的通信协议,在建立WebSocket通信连接前,需要使用HTTP协议进行握手,从HTTP连接升级为WebSocket连接.浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双

PHP魔术引号所带来的安全问题分析_php技巧

PHP通过提取魔术引号产生的"\"字符会带来一定的安全问题,例如下面这段代码片段: // foo.php?xigr='ryat function daddslashes($string, $force = 0) { !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc()); if(!MAGIC_QUOTES_GPC || $force) { if(is_array

关于asp+access的安全问题分析

众所周知,asp+access最大的安全隐患在于access数据库可以被别人    下载,而现在提供的很多asp空间都是只支持access数据库,这样一来,    asp+access的安全问题就显得很突出了. 1.Access数据库的存储隐患    在ASP+Access应用系统中,如果获得或者猜到Access数据库的存储路    径和数据库名,则该数据库就可以被下载到本地. 2.Access数据库的解密隐患    由于Access数据库的加密机制非常简单,所以即使数据库设置了密码,    解