什么是文件上传漏洞

文件上传漏洞指由于程序员在对用户文件上传部分的控不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。攻击者在入侵了一个网站后,通常会将这些ASP或者PHP后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。 小马:<?php @eval($_post[margin]);?>

文件上传漏洞的原因

  • 对于上传文件的后缀名(扩展名)没有做较为严格的限制
  • 对于上传文件的MIMETYPE(content-type)(用于描述文件的类型的一种表述方法)没有做检查
  • 权限上没有对于上传的文件目录设置不可执行权限
  • web server对于上传文件或者指定目录的行为没有做限制

    上传漏洞的畏寒

  • 上传web木马文件,控制web服务器文件、远程命令执行等

  • 上传系统病毒、木马文件进行挖矿、僵尸网络
  • 上传系统溢出程序进行权限提升
  • 修改web页面实现钓鱼、挂马、暗链等操作
  • 内网渗透
  • 在权限得到提升的情况下,想做什么都可以

    文件上传合法性检测方法

  • 前端js验证

  • mime类型验证
  • 黑白名单
  • 检查文件内容(getimagesize()函数用于获取图像信息、检验关键字)
  • 禁止本地文件包含漏洞
  • 使用安全的web服务(apache、Nginx、iis解析漏洞)

    文件下载漏洞概念

    一些网站由于业务需求,往往需要提供文件查看或者文件下载功能,单若对用户查看或者下载的文件不做限制,则恶意用户就能够查看或者下载任意敏感文件,这就是文件查看与下载漏洞
    下载服务器任意文件,如脚本代码、服务及系统配置文件等可用得到的代码进一步代码审计,得到更多可利用漏洞

    Pass-01

    开启burp suite抓包,点击上传没有成功抓包,说明是js前台验证。查看分析js源代码image.png
    截取返回并修改image.png
    这样就通过了前端JS验证burp suite截取返回配置:https://blog.csdn.net/qq_43422918/article/details/114528653?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link

    pass-02

    查看源码发现是判断文件类型image.png抓包修改符合要求的类型通过验证image.png

    pass-03

    观察源码发现我们只需要构造黑名单以外的后缀名即可进行绕过image.pngimage.png

    pass-04

    观察源码发现黑名单过滤image.png利用Apache配置文件解析把jpg当初PHP解析实现绕过image.png
    上传文件重命名可以实现防御

    pass-05

    观察源码发现是黑名单过滤,无大写过滤image.png
    修改文件大小写后缀实现绕过image.png

    pass-06

    观察源码黑名单验证,缺少收尾去空
    trim():去除字符串中的空格image.png
    抓包在文件后缀中添加空格实现绕过(只适用于Windows主机)image.png

    pass-07

    观察源码发现缺少文件末尾去点的操作image.png抓包在文件末尾添加点 实现绕过image.png

    pass-08

    观察源码是黑名单验证,缺少去除字符串::$条件image.png
    运用::$DATA的效果来让脚本不检测后缀名完成绕过image.png

    pass-09

    分析代码源码中的过滤都是一次过滤可以将文件的后缀名设置为 xxx.php. .(点 空格 点)完成绕过image.png
    最终上传文件后缀是php. (适用于Windows系统)image.png

    pass-10image.png

    分析原因包含在黑名单内的所有后缀名都替换成了空,可以用双写来进行绕过xx.pphphpimage.png

    pass-11

    00截断:Windows系统特性读取到%00时自动截断image.png
    运用%00来进行截断,且直接将想要上传的文件拼接到save_path变量中image.png
    绕过失败 条件需要:php版本小于5.3.4 php的magic_quotes_gpc为OFF状态

    pass-12image.png

    查看源码与上一关内容一样,只是提交方式改成post,可从hex中添加00截断绕过

    pass-13

    每个文件都有自己的文件头,代表文件类型。image.png
    分析代码,发现存在验证头信息image.png
    可以直接添加文件头或者合成图片+PHP文件实现绕过image.png

    pass-14

    分析代码getimagesize()函数 :用于获取图像大小及相关信息。只接收图像相当于限制了文件类型image.png
    上传一个图片马将后缀改名为PHP即可绕过与上题类似

    pass-15

    分析代码exif-imagetype:获取图片类型,验证上传图片的真实格式。只接收图像相当于限制了文件类型image.png
    上传一个图片马将后缀改名为PHP即可绕过与上题类似

    pass-16

    分析代码,也是图片验证格式image.png
    imagecreatefromjpeg():创建一块画布,并从jpeg文件或URL地址载入一副图像
    此关是把我们上传的图片在服务器进行重新渲染,那么我们如果单独上传一个图片马上去,我们的图片经过二次 渲染后,里面的一句话木马就会消失,所以我们要对比两张图片的差异,从而再次构造图片马先上传一张图片马然后下载,将下载的图片马和原先的图片进行对比,发现没有被渲染的位置插入PHP代码最后在上传,再下载观察PHP代码是否被渲染image.png

    pass-17

    查看源码image.png
    本关如果你上传的文件后缀名不在白名单里面,他会直接删除你上传的文件
    我们可以在重命名之前访问我们上传的文件,所以这题用到了条件竞争,使用python脚本不断的向服务器上传文件,然后访问上传的文件,上传的文件中有一句代码<?php fputs(fopen(‘shell.php’,’w’),’<?php phpinfo();?>’);?>这段代码执行以后,会创建一个名为shell.php里面有一句<?php phpinfo();?>的文件
    shell代码 <?phpfputs(fopen(‘shell.php’,’w’),’<?php @eval($_POST[‘ant’])?>’);?>image.png

    pass-18

    绕过方式与17一样,一个上传一个读取+Apache解析漏洞,从后面开始往前解析用一个后缀XXXX.php.aaaimage.png

    pass-19image.png

    1.jpg过pathinfo %00截断过move_uploaded_fileimage.png

    pass-20image.pngimage.png

    end取jpg