任意文件下载漏洞的利用思考

0x01 前言

任意文件下载漏洞作为最常见的WEB漏洞之一,在平常的渗透测试中经常遇到,但是很多人却并没有深入去想该如何利用这种漏洞,导致忽略了一些细节的信息。

0x02 传统利用

1) 下载配置文件连数据库

通过任意文件下载漏洞下载网站配置文件,利用数据库配置信息远程连接数据库。

php:通过读取当前页面源码反向查找数据库配置文件

aspx:  Web.config

java:WEB-INF/web.xml、WEB-INF/classes/applicationContext.xml 、application.yml、application.properties、conf/tomcat-users.xml

其它配置: php.ini、my.ini、MetaBase.xml、access.log

2) 下载操作系统敏感文件

通过下载操作系统中的文件获取敏感信息,不同操作系统中的敏感文件包括

Windows:  C:\Windows\win.ini  C:\Windows\System32\drivers\etc\hosts   C:\ProgramData\Microsoft\Search\Data\Applications\Windows\GatherLogs\SystemIndex\SystemIndex.{%d}.gthr  其中%d替换为1-500的数字,文件中保存大量应用对应的临时文件路径,可以泄露敏感信息,有时有奇效  C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt  其中Administrator可以替换为其它系统用户名,文件中保存Powershell历史执行命令记录
Linux:  /etc/passwd  /etc/shadow  /etc/profile  /etc/hosts  /etc/issue  /etc/ssh/sshd_config  /root/.bash_history    历史命令  /root/.ssh/authorized_keys  ssh公钥  /root/.ssh/id_rsa    ssh私钥  /root/.mysql_history    /proc/net/arp       内网arp表信息  /proc/net/route     内网路由表信息  /proc/net/tcp       主机建立的tcp连接信息,类似于netstat  /proc/[PID]/cmdline    其中pid替换为进程号,返回当进程运行时的命令  /proc/[PID]/environ  其中pid替换为进程号,返回当进程运行时的环境变量信息  /proc/self/loginuid  当前用户  /proc/sched_debug  获取当前进程信息

0x03 进阶利用

1)SpringBoot环境下的任意文件利用

SpringBoot一般来说是通过jar包来启动服务,如图3.1所示,所以通过任意文件下载漏洞最有利用价值的是下载到SpringBoot对应的jar包。

图片

图3.1 SpringBoot启动命令

这里可以组合linux文件下载中的多个文件,构造一条SpringBoot任意文件下载利用链,如下所示。

【Step1】

从图3.1可以看出SpringBoot一般是通过java命令来启动的,所以可以通过java关键字来定位对应的pid进程号。

通过任意文件读取/proc/sched_debug,获取服务器中的进程信息。通过关键字java定位SpringBoot对应的进程,获取进程号pid,如图3.2所示。

图片

图3.2 通过/proc/sched_debug定位pid

【Step2】

通过/proc/[PID]/cmdline和/proc/[PID]/environ获取进程对应的信息,一般情况下通过这种方式可以拿到SpringBoot对应的jar包的绝对路径,如图3.3,图3.4所示。其中cmdline可以获取进程对应的包名,environ可以获取对应的绝对路径,组合之后可以得到jar包对应绝对路径,如图3.5所示。

图片

图3.3 通过cmdline拿到启动命令信息

图片

图3.4 通过environ拿到jar包对应的绝对路径

图片

图3.5 通过组合的路径下载jar包

通过组合/proc/sched_debug和/proc/[PID]/environ可以满足绝大部分场景下对目标进程信息的探索。

2)SpringMVC环境下的任意文件利用

由于java程序并不能像PHP那样通过读当前文件来一步步下载整个程序的源码做代码审计,SpringMVC环境下一般的代码处理逻辑都在controller类中,但是我们仍然可以通过任意文件下载漏洞来下载对应的源码。

【Step1】

通过下载WEB-INF/web.xml文件,查看其中的servlet-class标签,有针对性下载标签对应的类名,如图3.6所示。

图片

图3.6 web.xml中定义的Servlet类

【Step2】

基于拿到的类的全限定类名,下载对应的class文件。如图3.6所示,拿到类的全限定类名是com.js.oa.jsflow.action.WorkFlowPdfServlet,则对应的class文件相对路径为classes/com/js/oa/jsflow/action/WorkFlowPdfServlet.class,如图3.7所示。

图片

图3.7 下载class文件相对于web.xml文件的相对路径

除了web.xml中可以找到类的全限定类名,在任何一个.class文件中,均可以找到这种类似的全限定类名。通过这种方式遍历可以较完整的拿到整个SpringMVC的源码,对于其它tomcat servlet项目也是一样的思路。

需要说明的是,并不是所有的tomcat项目的controller源码都能在WEB-INF/classes/目录下找到,还有部分系统会把逻辑代码写到jar包中并放在WEB-INF/lib/目录下,如图3.8所示,某系统在classes目录下不存在任何class文件,所有的逻辑均在WEB-INF/*.jar包中。如果代码逻辑在jar包中,就需要猜测jar包的完整名称,这种情况下通常不容易通过黑盒方式下载到源代码。

图片

图3.8 在classes目录下没有任何class文件

0x04 深度利用

在上面的方式中,还是偏向于通过任意文件下载下载网站源代码进行源码分析,但是在某些框架中,可以通过源码下载漏洞构造反序列化利用链,达到RCE的效果。

CodeIgniter框架是一个非常流行的php框架,在中小WEB应用中具有较大的使用量。旧版本的CodeIgniter默认情况下CodeIgniter的session保存在Cookie中,并且通过反序列的方式来加载。

我下载的CodeIgniter的源码是以前下载的,可能和最新的代码稍有出入。在system/libraries/Session.php文件中,如图4.1所示。

图片

图4.1 CodeIgniter对session进行处理的逻辑

其中保证Cookie不被篡改的关键是通过hash_hmac方法计算Cookie最后40位的hash值,其中$this->encryption_key是CodeIngniter框架配置文件中的值,保存在application/config/config.php文件中,这个值没有默认值,并且不能为空,如图4.2所示。

图片

图4.2 CodeIgniter对session进行签名校验的key

如果存在任意文件下载漏洞,下载对应的application/config/config.php文件,则可以获取Cookie加密的key,这样就可以把任意文件下载漏洞转化为反序列化漏洞。

在CodeIgniter框架中,如果Cookie中包含了序列化的内容,如图4.3所示,则代表可以通过任意文件读取获取加密key来构造反序列化过程,结合框架本身的反序列化利用链,则可能造成反序列化漏洞。

图片

图4.3 基于CodeIgniter框架的Cookie反序列化

基于框架的Cookie反序列化漏洞在实际中非常普遍,其它还有很多框架也有类似的问题,Yii框架也有类似于CodeIgniter一样的逻辑,在之前一篇关于通达OA的反序列化漏洞的文章https://mp.weixin.qq.com/s/nOQuqt_mO0glY-KALc1Xiw中,介绍过关于Yii硬编码key导致的反序列化漏洞。同样如果存在任意文件下载漏洞,则可以读取对应的key构造反序列化利用链。

如果是aspx的目标网站,同样可以通过任意文件下载,获取Web.config中关于ViewState参数的加密密钥,ViewState参数经过解密之后会进行反序列化操作,造成.net的反序列化漏洞,详情可以参考文章

https://paper.seebug.org/1386/。

0x05 总结

在渗透测试的过程中,如果遇到任意文件下载漏洞,多数场景下都可以对任意文件下载漏洞进行深入利用。本文主要结合一些特定的目标场景,总结一些关于任意文件下载漏洞的利用思路,本文仅做学习研究,请勿进行非法的网络攻击活动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/258595.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

翻译: LLMs关于人工智能的担忧 Concerns about AI

在短时间内,获取生成人工智能的能力已经在全球范围内传播,使许多人能够生成高质量的文章、图片和音频。随着这些惊人的能力的出现,也带来了许多关于人工智能的担忧。我认为即使在生成人工智能兴起之前,我们就已经生活在许多焦虑之…

charles和谷歌浏览器在Mac上进行软件安装,桌面上会显示一个虚拟磁盘,关掉页面推出磁盘内容都消失掉了 需要再次安装问题解决

其他软件也会有这种情况,这里我们以charles为例。绿色背景的内容是重点步骤。 1.如图,我下载了一个charles一个版本的dmg文件。 2.打开后,选择Agree 3.桌面会出现一个磁盘和如下页面 4.错误操作------可以不看 直接看第5步正确操作 常规情…

为什么GRU和LSTM能够缓解梯度消失或梯度爆炸问题?

1、什么是梯度消失(gradient vanishing)? 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。 2、什么是梯度爆炸(gradient exploding)? 参数更新过小大,破坏了…

亚马逊、沃尔玛、eBay:通过优化测评策略,提高店铺排名的秘诀

目前,亚马逊平台不仅考虑产品和店铺的排名,还会对产品列表进行排名。不同的排名有不同的影响因素。以下是亚马逊影响商品详情页排名的因素: 1.销售排行:卖家可以通过查看BSR榜单来了解自己的销售排名。销售排名反映了你的产品的销…

第二天使用seleninum创建创建员工

上一篇我们已经登录进了系统,下面看下怎么自动创建用户信息。 一:知识准备 创建用户前,我们学习下seleninum的页面元素获取和填写数据方法 send_keys 发送数据 find_element_by_xpath 通过xpath定位,这个上一节我们说过 二:查看页面结构 进入系统以后,我们要做的…

27.BGP边界网关路由协议

BGP边界网关路由协议 外部网关路由协议 ospf能承载的路由条目有限 用在运营商与运营商之间,国与国之间 BGP运行在IGP之上(内部网关路由) IGP都是在物理链路上直连的基础之上才能建立邻居关系,BGP可以跨路由器建立邻居关系&…

做一个类似东郊到家系统需要哪些功能?

随着移动互联网的普及,越来越多的人开始通过手机预约按摩服务。按摩预约小程序,作为一种方便快捷的预约方式,让用户可以随时随地预约按摩服务。那么,按摩预约小程序的开发周期是多长呢?它又有哪些功能呢?本…

死锁产生的条件是什么???如何进行死锁判断???

死锁是指两个或多个线程相互等待对方释放所持有的资源,导致程序无法继续执行的情况。死锁产生的条件是: 互斥条件:至少有一个资源必须处于非分享状态,即一次只能被一个线程占用。占有且等待条件:线程持有至少一个资源…

【QML】QML复制文件或文件夹,显示进度,多线程复制

1. 效果 可以显示复制文件和文件夹的进度 复制文件: bool copyFileFunc(QString _from, QString _to);复制文件夹:bool copyDirectoryFiles(const QString &_from, const QString &_to);举例: //复制文件copyhelper.copyFileToDir(&…

手机技巧:手机膜种类介绍,你真的了解吗

目录 一、材质分类 水凝膜 钢化玻璃膜 二、功能分类 抗蓝光膜 防窥膜 磨砂膜 三、最后 鉴于智能手机越来越“娇贵”的体质,能让手机“裸奔”的大神相信不在多数。 然而比较注重手机保养的朋友都会选择给手机贴膜,这样能防止手机刮划,…

数据结构--图(更新ing~)

树具有灵活性,并且存在许多不同的树的应用,但是就树本身而言有一定的局限性,树只能表示层次关系,比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中,数据元素之间的关系是任意的。 一、图…

Java:语法速通

参考 菜鸟教程 java 继承 class 父类 { }class 子类 extends 父类 { }继承的特性: 子类拥有父类非private的属性和方法子类可以对父类进行扩展子类可以重写父类的方法使用extends只能单继承,使用implements可以变相的多继承,即一个类继承…

24_28-Golang函数详解

**Golang **函数详解 主讲教师:(大地) 合作网站:www.itying.com** **(IT 营) 我的专栏:https://www.itying.com/category-79-b0.html 1、函数定义 :::info 函数是组织好的、可重复使用的、用…

雪花算法(几种常见的雪花算法生成ID方案简单介绍:Hutool、百度Uid-Generator、美团Leaf、Yitter)

文章目录 1.生成id的几种方式2. 雪花算法2.1 雪花算法介绍2.2 市面上几种雪花算法的实现2.2.1 hutool版2.2.1.1 hutool版本雪花算法 关于时钟回拨的处理: ---------------百度UidGenerator 介绍开始--------------2.2.2 百度版:[UidGenerator](https://g…

vue 流光边框矩形圆形容器

实现流光边框一般是用渐变背景加动画实现&#xff0c;然后使用内部盒子遮挡内部空间&#xff0c;达到边框流光的效果 思路&#xff1a;背景渐变旋转动画 功能&#xff1a; 自定义渐变&#xff08;是否渐变<不渐变没有流光效果>&#xff0c;渐变颜色&#xff0c;渐变角…

鉴赏 tcp vegas

优秀的 vegas 之后&#xff0c;再鉴赏一下迄今唯一像那么回事的拥塞控制算法 vegas。 从下图可看出所有的(对&#xff0c;所有的) aimd 都毫无伸缩性(z:吞吐&#xff0c;x:rtt&#xff0c;y:丢包率&#xff0c;由 buffer_size 直接决定)&#xff1a; 一下就可看出 rtt 和 bu…

LeetCode day27

LeetCode day27 —今天做到树&#xff0c;&#xff0c;&#xff0c;对不起我的数据结构老师啊~~~ 7. 整数反转 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c…

springboot跨域问题,解决方法

前端访问出现CORS跨域问题 不多说&#xff0c;直接上代码~ import org.springframework.stereotype.Component;import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;Component…

OpenAI 偷偷在训练 GPT-4.5!?

最近看到有人已经套路出 ChatGPT 当前的版本&#xff0c;回答居然是 gpt-4.5-turbo&#xff1a; 实际试验下&#xff0c;用 starflow.tech&#xff0c;切换到小星 4 全能版&#xff08;同等官网最新 GPT-4&#xff09;&#xff0c;复制下面这段话问它&#xff1a; What is the…

winfrom大恒工业相机SDK二次开发、C#联合halcon开发

一、开发环境 1.在大恒图像官网下载SDK安装包&#xff0c;安装SDK后&#xff0c;打开安装目录找到Samples文件夹&#xff0c;然后找到Samples\CSharp SDK\x64\DoNET\.NET4.0文件夹下找到GxIAPINET.dll&#xff0c;如图&#xff1a; 2.打开VS2019软件&#xff0c;建立winfrom项…
最新文章