任意文件下载/读取漏洞利用
正文
字面意思理解,就是你能够读取任何 你有权限读取到
的文件,但有一个最主要的问题就是,你不知道 文件名
一般情况下,任意文件读取/下载漏洞存在于 可下载资源,可读取文件的接口,比如网站读取指定图片
http://www.example.com/filedown.php?filename=testpic.png
或者是学校网站给下载文档的地方
http://www.example.com/filedown.php?file=xxxxx&filetype=doc
那么通过修改参数,就可以进行任意文件读取/下载
http://www.example.com/filedown.php?filename=../../../../../../../../../../etc/passwd
要注意的是,部分网站可能存在编码问题,所以构造的时候需要将 /
转为url编码 %2f
http://www.example.com/filedown.php?filename=..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd
可以说,任意文件读取/下载漏洞存在后,最经典的还是下载 /etc/passwd
文件
在我利用的漏洞中,这个文件也可以说是最关键的文件,下面有两种思路
思路1
根据当前目录,配合请求的url,来对文件进行读取,接着慢慢的通过源码,读取整个网站关联到的文件
例如
那么通过a href就可以得到 DisplayFIle.php
这个文件名
http://www.example.com/filedown.php?filename=./filedown.php
通过读取 displayfile.php
这个文件,在获取到其他文件的名字,最后找到敏感代码文件,审计绕过
思路2
这是我最爱的思路,因为我根本懒得审计代码
通过下载 /etc/passwd
文件,我们可以得到这台机器上的所有文件,以及用户主目录
最好的情况就是,你当前的用户,就能去下载 /root/.bash_history
文件,如果不行的话,可以考虑用以下脚本
执行后,会自动获取用户主目录,然后一个一个去尝试下载,最后下载下来审计用户操作记录,我有一次就是利用这个方法,最后定位到用户,接着深入挖掘
深入挖掘
那么有了 .bash_history
后,就可以开始审计操作记录了,首先我们要确定一个东西,那就是任何终端输入的东西,都会被记录到 .bash_history
中,比如 mysql-u root-p123456
这样一来,我们就相当于直接获取到了mysql的账号密码
上图是我挖edu的时候,读到的东西
除此之外,通过用户history,我们还可以下载到所有的例如网站备份脚本,网站备份文件,调用其他网站的api key 和 api id
如果存在备份脚本的话,还可通过审计脚本,逆推着写一个脚本来下载备份数据库文件,贴一张我漏洞报告中的记录
下载到 mysql_backup.sh
后,进行审计,然后写出脚本获取备份文件
总结
除了思路1那种审计网站的思路外,我最常用的其实就是,跟着管理员的操作来进行文件读取,因为有的网站是直接外面写好后,传入里面解压后,才部署的网站,如果管理员没删除部署文件的话,直接整站下载美滋滋
在针对登录的页面,进行审计绕过,也不失为一种方式,但是我还是偏向于,读取备份文件、网站脚本、网站配置文件
- [程序设计语言]-01:引言
- ASP.NET Ajax 库
- ASP.NET进程优化
- 多说 提速:js内页页脚加载、静态文件CDN
- 微信小程序的王者时代
- [程序设计语言]-[核心概念]-02:名字、作用域和约束(Bindings)
- NUMA架构
- 如何处理 Python 入门难以进步的现象?
- 编写前置和后置条件的连贯接口库:CuttingEdge.Conditions
- [程序设计语言]-[核心概念]-03:控制流
- 简单代码实现“网站维护中”“coming soon” 效果
- 使用Topshelf创建Windows 服务
- 自定义AuthorizeAttribute
- 系统进程管理工具Process Explorer
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript原型与继承
- 当TKE遇上Coding, 业务如何实现快速迭
- cocos creator 1.x透明渐变效果实现
- Cocos Creator 2.x透明渐变效果实现
- Themeleaf通过ajax局部更新
- ubuntu下利用expect实现screen多窗口开机运行
- hetzner服务器购买和安装debian系统
- 安全通告 | Apache SkyWalking SQL注入漏洞安全风险公告(CVE-2020-13921)
- Cmd Markdown 迁移备份的流程
- PyTorch3:计算图torch.autograph
- spark shell 配置 Kryo 序列化
- Mac里捣腾Kerberos(一)
- Spark on K8S 访问 Kerberized HDFS
- Apache Beam的Docker Demo
- docker login 报错了...