安全矩阵

 找回密码
 立即注册
搜索
查看: 949|回复: 0

一次任意文件读取与分析

[复制链接]

251

主题

270

帖子

1797

积分

金牌会员

Rank: 6Rank: 6

积分
1797
发表于 2022-10-23 17:37:52 | 显示全部楼层 |阅读模式
本帖最后由 Meng0f 于 2022-10-23 17:40 编辑

转载于:F12sec 2022-10-15 14:00 发表于福建

​ 本文记录以前的一次偶然测试过程,常见问题在文章底部。


地址来源
发现


第一眼看的时候,整个网站什么都没有,登录后也没有看到什么接口,猜测是个前后端不分离的,通过接口去做什么不太现实,只能想别的方法。

看了一下所有功能,连文章都是外链,不是本地渲染的页面,不过有一个是本地渲染出来的。


唯一一个本地渲染的页面

点进去是一个PDF预览,本以为有引用本地PDF,如:/file?path=xxx.pdf这样的,结果是以静态资源的形式加载的,想打任意文件读取的想法落空。

然后打开F12看看其他东西,突然发现一个问题。

所有的图片都是以读文件的方式加载的,传递两个参数,code和name,code都是一样的,name就是图片的名字,在这里尝试任意文件读取。



果然是读文件,而且直接读取出来了,下面就是读本程序源码。

首先确定web框架和程序路径。


WEB框架是Express,我第一次见到,百度了一下。(人非生而知之者,孰能无惑?)



node.js的web框架,那后端不就是JavaScript吗?虽然我还是不怎么会。

下面找项目路径,一个毕竟简单的办法。读取历史操作,因为这是linux系统所以直接可以直接读.bash_history文件。



文件读到了,粗略看了一下,部署人员严格按照“部署--删除”流程,没有残留任何压缩包之类的,本来想直接读压缩包下载回来,只能换一个办法,找配置文件。

根据历史操作记录得到路径,读入口文件app.js。



app.js文件内容

剩下的就比较简单了,拼路径读文件,比如:配置文件。



得到路径



读取

其他就不再赘述,下面是搞清楚为什么出现这个漏洞。

原因
读取工具类的读文件方法看看。



大部分还是看得懂的,我大胆解读一下,有错误希望大家指出,谢谢。

首先进入方法,code与name,通过code查库得到基本路径,然后路径拼接,文件真实路径:__dirname获得当前路径+../跳转上一级+查库得到的基本路径+name参数
后面就不用看了,就是验证文件是否存在,存在就读取发送到浏览器,没有就报提示信息。

重点在于let _file = path.join(__dirname, '../', pub.path + _name);按理说这里是正确的写法,不应该有问题。

为了搞清楚,我去查了官方文档。
参考地址:Modules: CommonJS modules | Node.js v16.18.0 Documentation


__dirname

__dirname是没有问题的,然后查阅path.join方法。

参考地址:Path | Node.js v16.18.0 Documentation


path.join方法接收无限个参数,并对参数进行拼接,重点是拼接完成后对路径进行标准化处理。虽然不知道标准化处理是什么,但是示例可以看到该方法能识别..跳转。



如图,拼接参数存在..会舍弃上一个参数

查阅path.join源码。
参考地址:https://github.com/nodejs/node/blob/v18.0.0/lib/path.js


path.join最后会调用normalize。
参考地址:Path | Node.js v16.18.0 Documentation



normalize方法会解析”.”与”..”,并对多个”\”或”/”进行处理。这就是这个漏洞产生的原因。
同样的在Python中也有path.join方法,但是没有这个问题。



nodejs与Python中path.join方法对比
因为Python真的是拼接,不会做任何处理。

参考地址:os.path --- 常见路径操作 — Python 3.7.13 文档



总结


这提醒我们,要注意各个编程语言的差异,尽可能避免这种漏洞产生,名字相同或相似,其功能未必真的一模一样。




Q:.bash_history文件在哪里?
A:用户家目录下,/home/username/.bash_history

Q:为什么我的root下没有 .bash_history 这个文件?
A:我也发现了这个问题,其原因是没有正常关机内容在内存中,没有存储到硬盘里。
参考地址:为什么我的root下没有 .bash_history 这个文件?登录用户就是root-慕课网
编辑




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 08:50 , Processed in 0.012942 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表