一次任意文件读取与分析
2022-10-15 14:1:38 Author: F12sec(查看原文) 阅读量:14 收藏

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

地址来源

发现
第一眼看的时候,整个网站什么都没有,登录后也没有看到什么接口,猜测是个前后端不分离的,通过接口去做什么不太现实,只能想别的方法。
看了一下所有功能,连文章都是外链,不是本地渲染的页面,不过有一个是本地渲染出来的。

唯一一个本地渲染的页面

点进去是一个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);按理说这里是正确的写法,不应该有问题。
为了搞清楚,我去查了官方文档。
参考地址:https://nodejs.org/dist/latest-v16.x/docs/api/modules.html#__dirname

__dirname

__dirname是没有问题的,然后查阅path.join方法。
参考地址:https://nodejs.org/dist/latest-v16.x/docs/api/path.html#pathjoinpaths

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

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

查阅path.join源码。

参考地址:https://github.com/nodejs/node/blob/v18.0.0/lib/path.js

path.join最后会调用normalize。

参考地址:https://nodejs.org/dist/latest-v16.x/docs/api/path.html#pathnormalizepath

normalize方法会解析”.”与”..”,并对多个”\”或”/”进行处理。这就是这个漏洞产生的原因。

同样的在Python中也有path.join方法,但是没有这个问题。

nodejs与Python中path.join方法对比

因为Python真的是拼接,不会做任何处理。

参考地址:https://docs.python.org/zh-cn/3.7/library/os.path.html#os.path.join

总结

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

Q:.bash_history文件在哪里?

A:用户家目录下,/home/username/.bash_history

Q:为什么我的root下没有 .bash_history 这个文件?

A:我也发现了这个问题,其原因是没有正常关机内容在内存中,没有存储到硬盘里。

参考地址:https://m.imooc.com/qadetail/158140

大家


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5NjU3NzE3OQ==&mid=2247488272&idx=1&sn=80e8779b4e2caede7b6671b792174984&chksm=c07fa8e4f70821f292cc19820aecd0d969c72fb169b06e1c9ed9b785628bf7ffcb592892413e#rd
如有侵权请联系:admin#unsafe.sh