如何实现Socket.io-file NPM模块中的文件类型限制绕过漏洞分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
创新互联公司专注于恒山企业网站建设,响应式网站开发,成都商城网站开发。恒山网站建设公司,为恒山等地区提供建站服务。全流程按需制作网站,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务
写在前面的话
在一次渗透测试过程中,我们所面对的应用程序安全系数比较高,没有存在太多的错误配置,因此简单分析并没有发现安全问题。但是深入分析后,我们发现了一个运行在嵌入式设备上的Web应用程序。这个Web应用程序使用了WebSocket来实现服务器和客户端之间的通信,为了使用WebSocket,后端系统可以选择的技术有很多种,而这里使用的是Socket.io。
这个应用程序的主要功能之一就是文件上传,这也是它选择使用Socket.io-file NPM模块的原因。总而言之,这里存在一个路径遍历漏洞,将允许我们上传文件到任意系统路径中,并让Web服务器运行该文件。
如果我们可以修改ssh_config、/etc/passwd或/etc/shadow文件的话,那么这个漏洞就相当于是一个远程代码执行漏洞了,但这只能通过root权限来实现,因此我们需要想办法利用低权限用户来实现远程代码执行。
通过研究之后,我们在Socket.io-file模块中找到了一个文件类型限制绕过漏洞。在该漏洞的帮助下,我们可以绕过模块配置文件中的文件类型限制。这样一来,我们就可以上传任意文件类型,然后通过修改底层配置文件来上传适当的Shell,以实现底层系统的远程代码执行。
除此之外,Socket.io-file的上传功能也存在对输入数据处理和验证逻辑不正确的问题,这些分布在代码的各个地方。而攻击者将能够利用该问题绕过上传文件类型的限制,将所选的文件类型上传到底层系统中。
漏洞描述
Socket.io-file的默认配置下,提供了一个由WebSocket处理的上传功能。当用户尝试通过Web应用程序上传一个文件时,将会创建下列客户端请求以实现文件创建:

42["socket.io-file::createFile",{"id":"u_0","name":"testfile.mp3","size":1,"chunkSize":10240,"sent":0,"data":{}}]为了在底层系统创建该文件,Socket.io-file的index.js代码将会被执行,下列代码将会检测文件的类型并执行后续操作:
let err = new Error('Not Acceptable file type ' + mimeType + ' of ' + filename + '. Type must be one of these: ' + this.accepts.join(', '));
return sendError(err);
}
else {
self.socket.emit(socket.io-file::complete::${id}, emitObj); self.emit('complete', emitObj);
}
}
else {
self.socket.emit(socket.io-file::complete::${id}, emitObj);
self.emit('complete', emitObj);比如说,如果用户上传了一个名为“testfile.mp3”的文件,那么应用程序将创建一个新的.mp3文件,由于钱买你的代码只会在客户端进行检测(WebSocket请求创建之前),那么我们就可以拦截上传请求,并以应用程序修改文件名的方式来修改创建文件的文件类型。下面给出的是漏洞利用样例:
42["socket.io-file::createFile",{"id":"u_0","name":"testfile.php","size":1,"chunkSize":10240,"sent":0,"data":{}}]为了绕过客户端限制,我们还需要将原始文件的文件类型修改问Web应用程序允许的文件类型。拦截请求之后,我们需要将文件类型修改为原始类型(.php),这样服务器端就不会进行检测了。接下来,我们就可以在底层系统创建一个.php文件了,这样也就实现了文件类型检测绕过。
除此之外,我们还可以结合路径遍历漏洞来执行攻击,我们继续往下看。
结合多个漏洞实现RCE
既然我们可以向任意服务器目录上传任意文件,那么我们就可以在特定配置下,在底层系统实现远程代码执行了。
场景1:修改配置文件
首先,我们可以修改配置文件,向Web服务器中添加恶意JavaScript代码库,然后修改index.html来加载恶意js脚本,即添加一个
基本
文件
流程
错误
SQL
调试
- 请求信息 : 2026-05-26 03:48:39 HTTP/1.1 GET : /article/pihjec.html
- 运行时间 : 4.5922s ( Load:0.0066s Init:3.5849s Exec:0.9654s Template:0.0352s )
- 吞吐率 : 0.22req/s
- 内存开销 : 2,237.45 kb
- 查询信息 : 12 queries 5 writes
- 文件加载 : 36
- 缓存信息 : 0 gets 0 writes
- 配置加载 : 130
- 会话信息 : SESSION_ID=to3kiulf99blnasiuqv2o6hgc0
- /www/wwwroot/tsicrk.com/index.php ( 1.09 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/ThinkPHP.php ( 4.61 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Think.class.php ( 12.26 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Storage.class.php ( 1.37 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Storage/Driver/File.class.php ( 3.52 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Mode/common.php ( 2.82 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Common/functions.php ( 53.56 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Hook.class.php ( 4.01 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/App.class.php ( 13.49 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Dispatcher.class.php ( 14.79 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Route.class.php ( 13.36 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Controller.class.php ( 11.23 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/View.class.php ( 7.59 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Behavior/BuildLiteBehavior.class.php ( 3.68 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Behavior/ParseTemplateBehavior.class.php ( 3.88 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Behavior/ContentReplaceBehavior.class.php ( 1.91 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Conf/convention.php ( 11.15 KB )
- /www/wwwroot/tsicrk.com/App/Common/Conf/config.php ( 2.14 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Lang/zh-cn.php ( 2.55 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Conf/debug.php ( 1.49 KB )
- /www/wwwroot/tsicrk.com/App/Home/Conf/config.php ( 0.31 KB )
- /www/wwwroot/tsicrk.com/App/Home/Common/function.php ( 3.33 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Behavior/ReadHtmlCacheBehavior.class.php ( 5.62 KB )
- /www/wwwroot/tsicrk.com/App/Home/Controller/ArticleController.class.php ( 6.02 KB )
- /www/wwwroot/tsicrk.com/App/Home/Controller/CommController.class.php ( 1.60 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Model.class.php ( 60.11 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Db.class.php ( 32.43 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Db/Driver/Pdo.class.php ( 16.74 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Cache.class.php ( 3.83 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Cache/Driver/File.class.php ( 5.87 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Template.class.php ( 28.16 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Template/TagLib/Cx.class.php ( 22.40 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Template/TagLib.class.php ( 9.16 KB )
- /www/wwwroot/tsicrk.com/App/Runtime/Cache/Home/7540f392f42b28b481b30614275e4e55.php ( 17.71 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Behavior/WriteHtmlCacheBehavior.class.php ( 0.97 KB )
- /www/wwwroot/tsicrk.com/ThinkPHP/Library/Behavior/ShowPageTraceBehavior.class.php ( 5.24 KB )
- [ app_init ] --START--
- Run Behavior\BuildLiteBehavior [ RunTime:0.000005s ]
- [ app_init ] --END-- [ RunTime:0.000029s ]
- [ app_begin ] --START--
- Run Behavior\ReadHtmlCacheBehavior [ RunTime:0.000391s ]
- [ app_begin ] --END-- [ RunTime:0.000423s ]
- [ view_parse ] --START--
- [ template_filter ] --START--
- Run Behavior\ContentReplaceBehavior [ RunTime:0.000077s ]
- [ template_filter ] --END-- [ RunTime:0.000115s ]
- Run Behavior\ParseTemplateBehavior [ RunTime:0.027408s ]
- [ view_parse ] --END-- [ RunTime:0.027447s ]
- [ view_filter ] --START--
- Run Behavior\WriteHtmlCacheBehavior [ RunTime:0.000222s ]
- [ view_filter ] --END-- [ RunTime:0.000248s ]
- [ app_end ] --START--
- 1064:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') LIMIT 1' at line 1
[ SQL语句 ] : SELECT `id`,`pid`,`navname` FROM `cx_nav` WHERE ( id= ) LIMIT 1
- 1064:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') LIMIT 1' at line 1
[ SQL语句 ] : SELECT `id`,`navname` FROM `cx_nav` WHERE ( id= ) LIMIT 1
- 1064:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
[ SQL语句 ] : SELECT `id`,`navname` FROM `cx_nav` WHERE ( pid= )
- [8] Undefined index: pid /www/wwwroot/tsicrk.com/App/Home/Controller/ArticleController.class.php 第 47 行.
- [8] Undefined index: db_host /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Db.class.php 第 120 行.
- [8] Undefined index: db_port /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Db.class.php 第 121 行.
- [8] Undefined index: db_name /www/wwwroot/tsicrk.com/ThinkPHP/Library/Think/Db.class.php 第 122 行.

4.5922s
