不安全的文件下载学习(含pikachu)

不安全的文件下载概述

文件下载功能在很多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可以设定为绝对路径,这样就只能在指定目录文件中进行下载。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值