1.什么是文件下载漏洞?这个网站漏洞的原理是啥?但是,如果文件下载功能设计不当,则可能导致攻击着可以通过构造文件路径,从而获取到

由于一些网站的业务 需要往往需要提供文件读取或下载的一个模块,但如果没有对读取或下载做一个白名
单或者限制,可能导致恶意攻击者读取下载一些敏感信息(etc/passwd等),对服务器做下一步的进攻与威
胁。

原理:没有对下载的文件做限制。

2.为什么会产生这个漏洞被黑客攻击?最直接的原因是啥?

由于文件下载功能设计不当,则可能导致攻击着可以通过构造文件路径,从而获取到后台服务器上的其他的敏感文件。( 又称:任意文件下载)

3.怎么发现这个漏洞?怎么去验证漏洞是否存在?怎么利用这个漏洞?

利用方式

由于不知道敏感文件的路径,我们可以利用../../(返回上次目录)进行猜解。

例如:

index.php?a=../../../../../etc/passwd
index.php?a=file:///etc/passwd

案例

  1. 发现有下载功能抓包发现GET请求包filename=kb.png传参

    http://lzctf.thecat.top/vul/unsafedownload/execdownload.php?filename=kb.png
  2. filename=xxx 尝试下载wwwroot目录下的flag.txt文件。
  3. http://lzctf.thecat.top/vul/unsafedownload/execdownload.php?filename=../../../../flag.txt

成功,下载其它敏感系统文件同理。

4.漏洞利用的首要条件是啥?漏洞危害的范围?漏洞导致的危害有多大?

通过任意文件下载,可以下载服务器的任意文件,web业务的代码,服务器和系统的具体配置信息,也
可以下载数据库的配置信息,以及对内网的信息探测等等。
总体来说,任意文件下载漏洞的利用主要是为了信息收集,我们通过对服务器配置文件的下载,获取到
大量的配置信息、源码,从而根据获取的信息来进一步挖掘服务 器漏洞从而入侵。以下整理了-些下载
利用文件:

Windows:
c:\boot.ini //查看系统版本
C:\Windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //MysqL配置
C:\Program Files\mysq \data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //MysqL配置信息
c:Windows\win. ini //windows系统的一一个基本系统配置文件
Linux:
/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参数

5.如果在甲方公司出现漏洞问题,公司站点受到此攻击,我应该如何快速定位到问题进行修复防止被入侵?

1.过滤/等敏感字符,使用户在urI中不能回溯上级目录
2.文件下载时判断输入的路径,最好的方法是文件应该在数据库中进行一一对应, 避免通过输入绝对路
径来获取文件.
3.php.ini配置open_ basedir限定文件访问范围

6.如何提前防范这个漏洞?如何做好加固?

1.对传入的文件名进行严格的过滤和限定
2.对文件下载的目录进行严格的限定;

7.代码分析

// $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;
//向浏览器返回数据
最后修改:2020 年 11 月 06 日 04 : 31 PM