不安全的文件下载概述

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如…/…/…/etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!

举例说明

你在网站上下载一张小黄图或者是才寻鲲gif,
这时候你向服务器放送请求,下载服务器目录下的文件。
这个时候,你就可以通过一些没安全意识的网站下在其他目录下的系统敏感文件。

不安全下载代码分析

利用方式

一般链接形式
download.php?path=
down.php?file=
data.php?file=
download.php?filename=或者包含参数:
&Src=
&Inputfile=
&Filepath=
&Path=
&Data=
**//当我们浏览网页时,经常见到此类链接形式和参数,可能就存在漏洞**

一般利用思路

(1)下载常规的配置文件,例如: ssh,weblogic,ftp,mysql等相关配置
(2)下载各种.log文件,从中寻找一些后台地址,文件上传点之类的地方,如果运气好的话会获得一些前辈们的后门。
(3)下载web业务文件进行白盒审计,利用漏洞进一步攻入服务器。任意文件在URL中都是有对应的文件名
尝试读取/root/.bash_history看自己是否具有root权限。如果没有的话。我们只能按部就班的利用…/来回跳转读取一些.ssh下的配置信息文件,读取mysql下的.bash_history文件。来查看是否记录了一些可以利用的相关信息。
然后逐个下载我们需要审计的代码文件,但是下载的时候变得很繁琐,我们只能尝试去猜解目录,然后下载一些中间件的记录日志进行分析。

如果我们遇到的是java+oracle环境

可以先下载/WEB-INF/classes/applicationContext.xml 文件,这里面记载的是web服务器的相应配置,然后下载/WEB-INF/classes/xxx/xxx/ccc.class对文件进行反编译,然后搜索文件中的upload关键字看是否存在一些api接口,如果存在的话我们可以本地构造上传页面用api接口将我们的文件传输进服务器

如果具有root权限

在linux中有这样一个命令 locate 是用来查找文件或目录的,它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次。当我们不知道路径是什么的情况下,这个可以说是一个核武器了,我们利用任意文件下载漏洞mlocate.db文件下载下来,利用locate命令将数据输出成文件,这里面包含了全部的文件路径信息。
locate 读取方法: locate mlocate.db admin //可以将mlocate.db中包含admin文件名的内容全部输出来

常见利用文件

/root/.ssh/authorized_keys //公钥存放路径
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd //用户名存放文件
/etc/shadow //密码存放文件
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数

pikachu练习


正常情况下点击图片下的名字就会将图片保存到需要的指定位置,但这是通过一个下载链接来进行下载的,右键点击名字获取到下载链接。

复制文字图片链接,粘贴到网址栏,可以看到在最后有下载路径和文件名称,这时可以在“=”后面,使用“…/…/”返回到指定上级路径,进行敏感文件的下载。



这里我们再使用目录遍历的方式,演示一个获取pikachu后台文件的方法
http://localhost/pikachu-master/vul/unsafedownload/execdownload.php?filename=…/…/…/…/pikachu-master/vul

漏洞修复

(1)过滤".",使用户在url中不能回溯上级目录
(2)正则严格判断用户输入参数的格式
(3)php.ini配置open_basedir限定文件访问范围

我们打开pikachu下载的配置文件

<?php$PIKA_ROOT_DIR =  "../../";include_once $PIKA_ROOT_DIR."inc/function.php";header("Content-type:text/html;charset=utf-8");
// $file_name="cookie.jpg";
$file_path="download/{$_GET['filename']}"; //这里!!!
//用以解决中文不能显示出来的问题
$file_path=iconv("utf-8","gb2312",$file_path);//首先要判断给定的文件存在与否
if(!file_exists($file_path)){skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php');return ;
}
$fp=fopen($file_path,"rb");
$file_size=filesize($file_path);
//下载文件需要用到的头
ob_clean();//输出前一定要clean一下,否则图片打不开
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$file_size);
Header("Content-Disposition: attachment; filename=".basename($file_path));
$buffer=1024;
$file_count=0;
//向浏览器返回数据//循环读取文件流,然后返回到浏览器feof确认是否到EOF
while(!feof($fp) && $file_count<$file_size){$file_con=fread($fp,$buffer);$file_count+=$buffer;echo $file_con;
}
fclose($fp);
?>

仔细看,在GET这个参数没有定义filename的匹配规则,同时,filename可以设定为绝对路径,这样就只能在指定目录文件中进行下载。

不安全的文件下载学习(含pikachu)相关推荐

  1. HTML入门学习-含代码和配套资料

      前段时间学习了一下HTML和简单的网页制作,非常有意思,这里把笔记和代码梳理一下.无论是否看过配套视频的,都比较容易理解,供大家参考学习,文章末尾附上可以下载运行的代码,有兴趣的小伙伴请自行下载运 ...

  2. flume学习-含安装

    1.Flume是什么:Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统.Flume基于流式架构,灵活简单. Flume组成架构 下面我们来详细介绍一下F ...

  3. MapReduce综合学习含Wordcount案例

    文章目录 MapReduce简介 MapTask ReduceTask Mapper阶段解读 Reducer阶段解读 MapReduce适用的问题 MapReduce的特点 MapReduce基本思想 ...

  4. Picasso 学习(含高斯模糊,圆头像,正方头像)

    ... 1.引用https://repo1.maven.org/maven2/com/squareup/picasso/picasso/2.5.2/picasso-2.5.2.jar 2.progua ...

  5. Kali配置LNMP环境并搭建pikachu环境

    文章目录 Kali配置LNMP环境并搭建pikachu环境 安装Nginx 安装PHP7.4和PHP扩展 配置Nginx和PHP-FPM 测试 安装mariadb 安装PHP Mysql扩展用来连接数 ...

  6. pikachu RCE

    网课学习笔记 pikachu RCE ping 1.先输入127.0.0.1 2.ping出来这些东西,想要查看目录,只要输入127.0.0.1&dir就好了,说明后端没有严格的处理,除了可以 ...

  7. 一致性Hash算法(KetamaHash)的c#实现

    Consistent Hashing最大限度地抑制了hash键的重新分布.另外要取得比较好的负载均衡的效果,往往在服务器数量比较少的时候需要增加虚拟节点来保证服务器能均匀的分布在圆环上.因为使用一般的 ...

  8. Struts2 文件上传,下载,删除

    本文介绍了: 1.基于表单的文件上传 2.Struts 2 的文件下载 3.Struts2.文件上传 4.使用FileInputStream FileOutputStream文件流来上传 5.使用Fi ...

  9. 【Alpha 冲刺】 2/12

    今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 完成API文档编写 由于外出比赛,故推迟 无 0 孙浩楷 1.完成VUE框架搭建 2.寻找在线编辑图片插件 已完成 WEB在线编辑 ...

最新文章

  1. web前端培训要学多久
  2. php文件改写nodejs,node.js – 提供PHP文件的nodejs,expressjs
  3. 2017.9.15 postgresql批量插入造成冲突后执行更新
  4. android adb 进程端口号被占解决方法
  5. .net 发送电子邮件
  6. Opencl入门Demo
  7. 东芝 rc100 linux,入门级NVMe固态硬盘首选,东芝RC100带来的超值体验
  8. PE格式文件修复过程
  9. 项目管理之项目风险应对
  10. 从发不起工资到融资1650万,逸创创始人叶翔如何熬过来的?
  11. 仿鱼爪新媒交易账号过户转让平台源码担保第三方账号交易系统公众号服务号抖音快手小红书
  12. Missing Marketing Icon - iOS Apps must include a 1024x1024px Marketing Icon in PNG format
  13. idea根据路径找控制器的插件(推荐)
  14. 三维重建、视觉定位、传感器位置推算,滴滴 AR 实景导航技术详解
  15. urv中保研碰撞测试结果_经撞=安全?中保研碰撞测试结果告诉我们:不一定!|乜都知...
  16. 小学文化学导数——斜率
  17. 研二小硕的艰难实习路
  18. 计算机专业需要用独显吗,集显 or 独显 我的程序用哪个必须由我定
  19. 【一起学UniGUI】--UniGUI的窗体和模块(6)
  20. c语言程序设计小组演示ppt,C语言程序设计讲稿完整版幻灯片.ppt

热门文章

  1. 网络营销——主要方法及举例分析
  2. 影魔法Dos(持续更新)
  3. 家用洗地机什么品牌质量好耐用?最适合家用的洗地机
  4. java文件保存时出现错误提示
  5. 如何图片转文字?这三种方法快记下来
  6. EasyAR实现脱卡功能
  7. yl335b分拣站单元流程图_Yl-335B生产线试题
  8. 基于java阿博图书馆管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  9. Transfer Learning for Non-Intrusive Load Monitoring
  10. 7亿美元融资是假 外卖刷单是真 美团自打脸