本文记录以前的一次偶然测试过程,常见问题在文章底部。地址来源
第一眼看的时候,整个网站什么都没有,登录后也没有看到什么接口,猜测是个前后端不分离的,通过接口去做什么不太现实,只能想别的方法。看了一下所有功能,连文章都是外链,不是本地渲染的页面,不过有一个是本地渲染出来的。唯一一个本地渲染的页面
点进去是一个PDF预览,本以为有引用本地PDF,如:/file?path=xxx.pdf这样的,结果是以静态资源的形式加载的,想打任意文件读取的想法落空。
所有的图片都是以读文件的方式加载的,传递两个参数,code和name,code都是一样的,name就是图片的名字,在这里尝试任意文件读取。果然是读文件,而且直接读取出来了,下面就是读本程序源码。WEB框架是Express,我第一次见到,百度了一下。(人非生而知之者,孰能无惑?)
node.js的web框架,那后端不就是JavaScript吗?虽然我还是不怎么会。
下面找项目路径,一个毕竟简单的办法。读取历史操作,因为这是linux系统所以直接可以直接读.bash_history文件。文件读到了,粗略看了一下,部署人员严格按照“部署--删除”流程,没有残留任何压缩包之类的,本来想直接读压缩包下载回来,只能换一个办法,找配置文件。根据历史操作记录得到路径,读入口文件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#pathjoinpathspath.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=MzI3NzI4OTkyNw==&mid=2247488591&idx=1&sn=923dd434220037359a202d1136ec5ba5&chksm=eb69dae7dc1e53f169b4596d81dd66072f15a43720c4ed0ed72883ac17444347592fb0cf265f#rd
如有侵权请联系:admin#unsafe.sh