文件上传在数据包中可修改的地方

  1. Content-Disposition:一般可更改

  2. name:表单参数值,不能更改

  3. filename:文件名,可以更改

  4. Content-Type:文件 MIME,视情况更改

常见绕过WAF的方法

  1. 数据溢出-防止WAF匹配(xxx...)'
  2. 符号变异-防止WAF匹配(' " ;)
  3. 数据截断-防止WAF匹配(%00 ; 换行)
  4. 重复数据-防止WAF匹配(参数多次)

WAF绕过简单演示

我以靶场upload-labs第二关进行演示。

我们开启安全狗的上传防护:



第2关上传一个php文件,被安全狗检测到且被拦截:



php加上空格"ph p",可上传,但无法解析。

1. 垃圾数据溢出法

  • filename的内容进行溢出。



    filename的内容进行溢出虽然可以绕过WAF但是我无法将php文件上传至服务器。

  • name与filename之间进行溢出

    也可绕过WAF但是无法上传php文件。



  • 大量垃圾数据后加“;”

    Content-Disposition与name之间的垃圾数据加上分号可绕过安全狗。



    可成功上传php文件



    经测试,name与filename之间的垃圾数据也可绕过。

2. 符号变异绕过

可用payload:

  1. filename=" xx.php
  2. filename="x x.php
  3. filename=' xx.php
  4. filename='x x.php
  • filename的内容用单引号括起来(被拦截)



    显然被拦截
  • filename去掉最后一个双引号(被拦截)



    被拦截
  • filename去掉最后一个双引号,再加上分号(后缀不能被解析)



    可绕过,可上传,但是无法被解析
  • filename去掉最后一个双引号,在文件名后缀前任意位置加空格(可行)



    可绕过WAF,可上传。
  • 单引号与双引号一致。
  • 只在末尾加双引号(被拦截)

  • 文件名前加双引号或单引号(无法解析)

    文件名前加双引号或单引号可绕过waf,也可上传,但是无法解析。

  • 文件名中加入图片后缀提前用分号截断

3. 数据截断绕过

可用payload:

  1. filename="x.jpg;shell.php"
  2. filename="x.jpg;shell.php
  3. filename='x.jpg;shell.php
  4. filename="shell.php%00xx.jpg" 注意%00要编码
  • 文件名中加入图片后缀提前用分号截断(可行)

    原因是防护软件只检测前面的部分,一旦正确就放行,不再检测后面的



    同理结合符号变形可有:
  1. filename="x.jpg;shell.php
  2. filename='x.jpg;shell.php
  3. ·····
  • 文件名中用%00url编码截断(可行)

4. 数据换行截断

可用payload:

  1. x.ph
  2. p
  3. x.p
  4. h
  5. p
  6. x.
  7. p
  8. h
  9. p
  10. x
  11. .
  12. p
  13. h
  14. p
  • 直接在数据包中进行换行操作(可行)





5. 重复数据绕狗(参数多次)

  • 重复filename

    前面的filename为可接受的文件格式,最后一个为php文件格式,前面的重复多次,可绕过。

  • filename中配合其他参数

    配合Content-Type: image/jpeg:

6. "/"与";"配合绕过

payload:

  1. filename="/jpeg;x.php"
  2. filename="/jpeg;/x.php"



7. FUZZ字典配合

字典地址:

  1. https://github.com/TheKingOfDuck/fuzzDicts
  2. https://github.com/fuzzdb-project/fuzzdb

手工测试的话有点麻烦,我们可以借助写好的字典配合BP进行批量测试,先在本地测试好了,再在真实环境进行测试,以防会封IP。

我借助fuzzDicts的php字典进行测试。

首先将拦截的数据包发送至Intruder



清除所有变量



将filename的值设置为变量



payload加载字典:



开始攻击:



能否成功取决于字典的好坏。

安全及修复建议

  1. 后端验证:采用服务端验证模式
  2. 后缀检测:基于黑名单,白名单过滤
  3. MIME 检测:基于上传自带类型检测
  4. 内容检测:文件头,完整性检测
  5. 自带函数过滤:参考 uploadlabs关卡的函数
  6. 自定义函数过滤:function check_file(){}等
  7. WAF 防护产品:宝塔,云盾,安全公司产品等

文件上传之WAF绕过及相安全防护的更多相关文章

  1. 24:WEB漏洞-文件上传之WAF绕过及安全修复

    本课重点 案例1:上传数据包参数对应修改测试 案例2:safedog+云服务器+uploadlabs测试 案例3:safedog+云服务器+uploadlabs_fuzz测试 案例4:文件上传安全修复 ...

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

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

  3. 文件上传——客户端检测绕过(JavaScript检测)(一)

    前言 通常再一个web程序中,一般会存在登陆注册功能,登陆后一般会有上传头像等功能,如果上传验证不严格就可能造成攻击者直接上传木马,进而控制整个web业务控制权.下面通过实例,如果程序只进行了客户端J ...

  4. 文件上传过waf的方法

    原文链接: https://www.cesafe.com/8411.html 原始请求包: ——WebKitFormBoundary2smpsxFB3D0KbA7D Content-Dispositi ...

  5. 文件上传绕过WAF

    文件上传 文件上传实质上还是客户端的POST请求,消息主体是一些上传信息.前端上传页面需要指定 enctype为multipart/from-data才能正常上传文件. 此处不讲各种中间件解析漏洞只列 ...

  6. Web攻防系列教程之文件上传攻防解析(转载)

    Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...

  7. web漏洞-命令执行、文件上传、XSS

    一.命令执行   1:什么是命令执行? 命令执行漏洞是指攻击者可以随意执行系统命令.属于高危漏洞之一任何脚本语言都可以调用操作系统命令. 应用有时需要调用一些执行系统命令的函数,举个例子如:PHP中的 ...

  8. 过waf实战之文件上传bypass总结

    这里总结下关于waf中那些绕过文件上传的姿势和尝试思路 环境 apache + mysql +php waf:某狗waf 这里写了一个上传页面 <html> <body> &l ...

  9. 漏洞利用:验证绕过,XSS利用,Cookic盗用,文件上传

    1.      文件上传 低级别 写好上传的内容 选择好上传的文件 上传成功. 测试:访问文件,执行代码 中级别 修改文件后缀为png 上传该文件 抓包修改文件后缀为php,然后允许数据包通过. 上传 ...

随机推荐

  1. 三剑客-sed

    1.sed命令概述说明: 字符流编辑工具(行编辑工具) 2.sed命令作用说明: (1)擅长对行进行操作处理 (2)擅长将文件的信息进行修改调整/删除 3.sed具体功能 (1)文件中添加信息的能力( ...

  2. 浅析富文本编辑器框架Slate.js

    浅析富文本编辑器框架Slate.js 本文不是关于Slate.js使用入门的文章,如果还不了解该框架,建议先阅读下官方的文档:Slate官网文档 关于Slate的一些特性 不同于其他编辑器类的库,Sl ...

  3. Jenkins 凭证 Devops 的粘合剂

    大家好,我是小猿来也,一个热衷于搞 Devops 自动化的 Java 程序猿. 万事具备,只欠东风.当我决定大搞特搞 Devops 的时候,Jenkins 凭证却傻傻分不清. 玩 Devops 的小伙 ...

  4. 前端 JavaScript 实现一个简易计算器

    前端使用 JavaScript 实现一个简易计算器,没有难度,但是里面有些小知识还是需要注意的,算是一次基础知识回顾吧. 题目 实现一个简易版的计算器,需求如下: 1.除法操作时,如果被除数为0,则结 ...

  5. Linux:修改Ubuntu环境变量后bash找不到

    1.问题显示 修改环境变量,导致命令全部失效  2.解决办法 #使用备份bin export PATH=/usr/bin:/bin  之后使用命令就可以了. 3.找到修改的环境变量 一般修改的环境变量 ...

  6. Mysql/Oracle/达梦中数据字典表

    在mysql中,数据字典表存放在information_schema库中,,对应的两张表,分别是TABLES,和COLUMNS. 在oracle中有表空间(即用户空间或者库)和模式的概念.模式和表空间 ...

  7. linux sort uniq命令详解

    sort 功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序. sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+&l ...

  8. 15 shell for循环

    除了 while 循环和 until 循环,Shell 脚本中还有for 循环,for 循环有两种使用形式:C语言风格的for循环与Python语言风格的for in循环,两种形式的for循环用法对比 ...

  9. PHP7与php5

    php在2015年12月03日发布了7.0正式版,带来了许多新的特性,以下是不完全列表: 性能提升:PHP7比PHP5.6性能提升了两倍. Improved performance: PHP 7 is ...

  10. redis学习笔记(二)——java中jedis的简单使用

    redis怎么在java中使用,那就是要用到jedis了,jedis是redis的java版本的客户端实现,原本原本想上来就直接学spring整合redis的,但是一口吃个胖子,还是脚踏实地,从基础开 ...