一次任意文件读取与分析

admin 2022年10月11日12:18:24评论97 views字数 1856阅读6分11秒阅读模式
一次任意文件读取与分析
本文记录以前的一次偶然测试过程,常见问题在文章底部。

一次任意文件读取与分析


地址来源

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

一次任意文件读取与分析

唯一一个本地渲染的页面

点进去是一个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

一次任意文件读取与分析

一次任意文件读取与分析

大家

一次任意文件读取与分析

原文始发于微信公众号(墨雪飘影):一次任意文件读取与分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月11日12:18:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   一次任意文件读取与分析http://cn-sec.com/archives/1342278.html

发表评论

匿名网友 填写信息