文件下载
文件下载
ccb文件下载
原理
网站上文件下载功能的实现通常是通过对参数filename的值的对应,获取在服务器上所需下载的文件的绝对路径,然后读取文件内容并发送给客户端进行下载。
如果这些有下载功能的网站没有对前端用户的下载请求的文件类型、目录做合理严谨的规则进行过滤,导致用户通过路径回溯符../
等相关操作,跳出了程序本身的限制目录,然后再利用文件下载功能,使前端下载请求可以下载服务器中的任意文件。
产生条件
网站给用户提供了下载文件的功能,并能接收相关的参数变量
后端使用了读取文件的相关函数
网站对前端用户读取文件的请求没有进行相应的控制或控制不严(限制、校验)
网站能输出请求文件的内容,提供给前端下载
文件下载漏洞的挖掘
寻找漏洞位置
找到有文件下载功能的网站:
根据功能:一般可以根据下载功能去找,一些明显的软件下载网站等;
根据关键字符串:
1 | download.php?path= |
1 | &ReadPath= |
分析下载链接中的参数变量
一般要先解码。
比如http://down.znds.com/getdownurl/?s=L2Rvd24vMjAyMTExMTcveXN0XzEuNC41X2RhbmdiZWkuYXBr
s的值经过base64解码后得到下载文件路径:down/20211117/yst_1.4.5_dangbei.apk
然后看参数能否修改。
linux的一些系统文件路径:
1 | /etc/passwd //保存了系统中所有的用户信息 |
windows的一些系统文件路径:
1 | C:\boot.ini //查看系统版本 |
tomcat的一些配置文件的路径:
1 | apache-tomcat-8.5.51/conf/tomcat-users.xml //tomcat的角色(授权用户)配置文件 |
1 | apache: |
危害
下载服务器的任意文件:
获得网站web源码,再对代码进行审计,以获得更多的漏洞
获得网站、服务器、系统、数据库等中间件配置文件
获得应用的系统配置文件
内网探测
下载各种.log文件,并寻找后台地址、文件上传点等地方
利用
以pikachu为例:
分析下载文件的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参数这里存在文件下载漏洞。
扫描网站目录
接下来可以使用御剑、铸剑等工具进行探针,看一看存在哪些敏感文件,构造我们所需要的下载链接:
下载敏感文件进一步攻击
下载好的文件代码中去分析路径和文件包含。
举例:config.php配置文件—>得到数据库密码—>连接数据库
http://127.0.0.1/pikachu-master/vul/unsafedownload/execdownload.php?filename=../../inc/function.php
下载成功:
防御
净化数据:
对用户传过来的文件名参数进行统一编码
对文件类型进行白名单控制
对包含恶意字符或者空字符的参数进行拒绝。比如**过滤.(点)**,使用户在url中不能回溯上级目录,正则严格判断用户输入参数的格式。
要下载的文件地址保存至数据库中,与网站目录隔开。
文件路径保存至数据库,让用户提交文件对应ID下载文件。
用户下载文件之前需要进行权限判断。
文件放在web无法直接访问的目录下。
不允许提供目录遍历服务。
公开文件可放置在web应用程序下载目录中通过链接进行下载。
php.ini配置open_basedir限定文件访问范围。
实例
https://blog.csdn.net/m0_62619269/article/details/125043182
[RoarCTF 2019]Easy Java
登录界面尝试SQL注入,没有注入点,点击help:
分析文件下载URL
URL中存在filename参数,推测可能存在文件下载漏洞。
该链接以get请求文件,但是失败,因为Java一般文件下载以post方式提交。
所以尝试用POST方式来进行请求,发现可以下载文件。下载了一个help.docx的文件。
尝试下载其他文件
这里要用到 web-inf 的知识:
1 | 这里对WEB-INF进行一个简单的了解。 |
尝试将参数的值换为WEB-INF/web.xml
,发现成功返回内容。
1 | <servlet> |
分析文件内容发现可疑class文件。
构造payload:filename=/WEB-INF/classes/com/wm/ctf/FlagController.class
,下载FlagController.class。
下载后,文件内容中存在base64编码:
String flag = "ZmxhZ3thNTkzMTBiMy1lZjkzLTQ5ODktOTVlMC0zYTQ2ZmZhMThiYjh9Cg==";
解码即可得到flag。