文件下载

文件下载

image-20220804214515223

原理

网站上文件下载功能的实现通常是通过对参数filename的值的对应,获取在服务器上所需下载的文件的绝对路径,然后读取文件内容并发送给客户端进行下载。

如果这些有下载功能的网站没有对前端用户的下载请求的文件类型、目录做合理严谨的规则进行过滤,导致用户通过路径回溯符../等相关操作,跳出了程序本身的限制目录,然后再利用文件下载功能,使前端下载请求可以下载服务器中的任意文件。

产生条件

网站给用户提供了下载文件的功能,并能接收相关的参数变量

后端使用了读取文件的相关函数

网站对前端用户读取文件的请求没有进行相应的控制或控制不严(限制、校验)

网站能输出请求文件的内容,提供给前端下载

文件下载漏洞的挖掘

寻找漏洞位置

找到有文件下载功能的网站:

  • 根据功能:一般可以根据下载功能去找,一些明显的软件下载网站等;

  • 根据关键字符串:

1
2
3
4
5
6
7
8
9
download.php?path=
download.php?file=
down.xxx?filename=
down.php?file=

data.php?file=
read.xxx?filename=
readfile.php?file=
read.php?filename=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&ReadPath=
&FilePath=
&filepath=
&Filepath=
&Path=
&path=
&inputFile=
&Inputfile=
&url=
&urls=
&Lang=
&dis=
&data=
&Data=
&readfile=
&filep=
&src=
&menu=
META-INF
WEB-INF

分析下载链接中的参数变量

一般要先解码。

比如http://down.znds.com/getdownurl/?s=L2Rvd24vMjAyMTExMTcveXN0XzEuNC41X2RhbmdiZWkuYXBr

s的值经过base64解码后得到下载文件路径:down/20211117/yst_1.4.5_dangbei.apk

然后看参数能否修改。

linux的一些系统文件路径:

1
2
3
4
5
6
7
8
9
/etc/passwd            //保存了系统中所有的用户信息
/etc/shadow //用户的密码信息
/root/.ssh/authorized_keys //公钥文件
/root/.bash_history //用户终端操作历史记录
/usr/local/app/apache2/conf/httpd.conf //apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //php相关设置
/etc/httpd/conf/httpd.conf //apache
/etc/php5/apache2/php.ini //ubuntu系统的默认路径

windows的一些系统文件路径:

1
2
3
4
5
6
7
8
9
10
11
12
C:\boot.ini                //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //查看IIS虚拟主机配置文件
C:\windows\repair\sam //存储Windows系统初次安装的密码
C:\Program Files\mysql\my.ini //mysql配置,记录管理员登陆过的MYSQL用户名和密码
C:\Program Files\mysql\data\mysql\user.MYD //mysql.user表中的数据库连接密码
C:\windows\php.ini php.ini //php配置文件
C:\Windows\system.ini //winnt的php配置信息
C:\Windows\win.ini //winnt的mysql配置文件
C:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储虚拟主机网站路径和密码
C:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf //查看WINDOWS系统apache文件
C:/Resin-3.0.14/conf/resin.conf //查看jsp开发的网站resin文件配置信息.
C:\Windows\System32\drivers\etc\hostswinserver //配置Telnet信息

tomcat的一些配置文件的路径:

1
2
3
4
5
apache-tomcat-8.5.51/conf/tomcat-users.xml              //tomcat的角色(授权用户)配置文件
apache-tomcat-8.5.51/conf/server.xml //tomcat的主配置文件
apache-tomcat-8.5.51/conf/web.xml //tomcat应用程序的部署描述符文件
apache-tomcat-8.5.51/logs/catalina.out
// 即tomcat的标准输出和标准出错,所有输出到这两个位置的都会进入catalina.out,这里包含tomcat运行自己输出的日志以及应用里向console输出的日志。
1
2
3
4
5
6
7
8
9
10
11
apache:
/etc/httpd/conf/httpd.conf
/etc/apache2/httpd.conf
/etc/apache2/apache2.conf
nginx:
/etc/nginx/nginx.conf
/usr/local/nginx/conf/nginx.conf
/usr/local/etc/nginx/nginx.conf
redis:
/etc/redis.conf
index.php?f=../../../../../../etc/passwd

危害

下载服务器的任意文件

获得网站web源码,再对代码进行审计,以获得更多的漏洞

获得网站、服务器、系统、数据库等中间件配置文件

获得应用的系统配置文件

内网探测

下载各种.log文件,并寻找后台地址、文件上传点等地方

利用

以pikachu为例:

image-20220811205457049

分析下载文件的URL

直接在网站上查看图片,可以知道图片在网站内的存储地址:http://10.1.1.7/vul/unsafedownload/download/rayal.png

该图片的下载链接为:http://127.0.0.1/pikachu-master/vul/unsafedownload/execdownload.php?filename=rayal.png

测试能否下载其他文件

通过上面的两个下载的地址我们可以可以测试文件下载漏洞:

http://10.1.1.7/vul/unsafedownload/execdownload.php?filename=../execdownload.php

根据上面的分析通过链接下载到了文件execdownload.php

很明显filename参数这里存在文件下载漏洞。

扫描网站目录

接下来可以使用御剑、铸剑等工具进行探针,看一看存在哪些敏感文件,构造我们所需要的下载链接:

image-20220811212858165

下载敏感文件进一步攻击

下载好的文件代码中去分析路径和文件包含。

举例:config.php配置文件—>得到数据库密码—>连接数据库

http://127.0.0.1/pikachu-master/vul/unsafedownload/execdownload.php?filename=../../inc/function.php

下载成功:

image-20220811212931057

防御

  1. 净化数据:

    对用户传过来的文件名参数进行统一编码

    对文件类型进行白名单控制

    对包含恶意字符或者空字符的参数进行拒绝。比如**过滤.(点)**,使用户在url中不能回溯上级目录,正则严格判断用户输入参数的格式。

  2. 要下载的文件地址保存至数据库中,与网站目录隔开。

  3. 文件路径保存至数据库,让用户提交文件对应ID下载文件。

  4. 用户下载文件之前需要进行权限判断

  5. 文件放在web无法直接访问的目录下。

  6. 不允许提供目录遍历服务。

  7. 公开文件可放置在web应用程序下载目录中通过链接进行下载。

  8. php.ini配置open_basedir限定文件访问范围。

实例

https://blog.csdn.net/m0_62619269/article/details/125043182

[RoarCTF 2019]Easy Java

image-20220812093558024

登录界面尝试SQL注入,没有注入点,点击help:

image-20220812093722952

  • 分析文件下载URL

    URL中存在filename参数,推测可能存在文件下载漏洞。

    该链接以get请求文件,但是失败,因为Java一般文件下载以post方式提交。

    所以尝试用POST方式来进行请求,发现可以下载文件。下载了一个help.docx的文件。

image-20220812094228417

  • 尝试下载其他文件

    这里要用到 web-inf 的知识:

1
2
3
4
5
6
7
8
9
10
11
12
这里对WEB-INF进行一个简单的了解。

WEB-INF是java的WEB应用的安全目录。
1.WEB-INF/web.xml:web应用程序配置文件,描述了servlet和其他的应用组件配置及命名规则。
2.WEB-INF/classes:包含了站点所有用的class文件,包括servlet class和非servlet class
3.WEB-INF/lib:存放web应用需要的JAR文件
4.WEB-INF/src:源码目录,按照包名结构放置各个java文件
5.WEB-INF/database.properties:数据库配置文件
6.WEB-INF/tags:存放了自定义标签文件
7.WEB-INF/jsp:jsp 1.2 一下版本的文件存放位置。
8.WEB-INF/jsp2:存放jsp2.0以下版本的文件。
9.META-INF:相当于一个信息包。

尝试将参数的值换为WEB-INF/web.xml,发现成功返回内容。

1
2
3
4
<servlet>
<servlet-name>FlagController</servlet-name>
<servlet-class>com.wm.ctf.FlagController</servlet-class>
</servlet>

分析文件内容发现可疑class文件。

构造payload:filename=/WEB-INF/classes/com/wm/ctf/FlagController.class,下载FlagController.class。

下载后,文件内容中存在base64编码:

String flag = "ZmxhZ3thNTkzMTBiMy1lZjkzLTQ5ODktOTVlMC0zYTQ2ZmZhMThiYjh9Cg==";

解码即可得到flag。