当前位置: 首页 > news >正文

文件上传总结

一、原理

通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好,使得恶意用户可以通过文件中上传的一句话木马获得操控权

二、绕过方法

1>前端绕过

1.删除前端校验函数

checkFile()

2.禁用js代码
3.bp修改数据包

上传符合要求的后缀名,用bp抓包,修改为木马后缀名即可

2>黑名单绕过
1.等价扩展名绕过
等价扩展名
aspasa,cer,cdx
aspxashx,asmx,ascx
phpphp2,php5,phtml,phps
jspjspx,jspf
2.上传.htaccess文件

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

大概意思为,.htaccess文件可以将1.jpg文件当作php文件解析执行。

3.大写绕过(仅Windows)

修改php文件的后缀为1.PHp,然后上传此文件即可

4.空格绕过(仅Windows)

利用bp抓包,在文件扩展名后加空格即可(没有trim函数)

5.点号绕过(仅Windows)

扩展名后加点即可

6.::$DATA绕过限制(仅Windows)

Windows系统在保存1.php::$DATA一类的文件时会自动去除文件后的::$DATA字符串,保存的文件名为1.php。

7.空格+点号绕过

例如1.php . .

8.双写绕过(str_ireplace函数)

程序中的str_ireplace函数会将黑名单中的后缀替换为空,但是只替换了一次,因此我们可以使用双写绕过此函数

9.00截断(move_uploaded_file函数)

move_uploaded_file()函数本身存在逻辑漏洞缺陷,可以实现00截断绕过。也可以在php文件名后添加任意字符,只要不在黑名单限制内都可成功上传文件

10.php其他标签绕过

    <?php @eval($_POST['cmd']); ?>            //正常写法
    <? @eval($_POST['cmd']); ?>                //短标签,适合过滤php
    <% @eval($_POST['cmd']); %>                //asp风格
    <script language='php'>@eval($_POST['cmd']);</script>            //<script>风格,适合过滤<?

11.文件头检测绕过

可以通过php截断后,添加GIF89a进行绕过

12..user.ini

数据包修改为名为.user.ini

类型为image/png

内容为“GIF89a auto_prepend_file=1.png”

三.白名单绕过

1.MIME绕过

抓包将content-type字段的类型修改为image/jpeg,即可绕过检测

2.GET型00截断(仅Windows)

windows系统识别到文件名中00的时候将不再向后识别

仅适用于

php版本小于5.3.4
php的配置文件php.ini中的magic_quotes_gpc 的值需要修改为Off

3.POST型00截断

在1.php文件后添加00

4.二次渲染

在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),生成一个新的图片保存至服务器中。我们可以将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,将Webshell代码插在该部分,然后上传。

图片马上传后,重新下载,将图片马与下载后的图片在010中进行十六进制比较。找到两个文件数据相同块,在下载后的图片数据相同处插入php恶意语句保存即可。

也可以通过 imagecreatefromgif函数直接转换与原图片进行对比

<?php
$demo = imagecreatefromgif('file');
imagegif($demo,"outfile");
?>

5.条件竞争时间差

当文件上传后,服务器会首先保存然后重命名,最后再把源文件删除。在文件删除之前,如果线程过大可能导致服务器处理数据变慢,从而使黑客有时间对上传的webshell进行访问。此过程只会删除上传的文件,但是不会删除生成的文件,因此可以使用如下的php代码获取shell。

6.apache的addhandler配置解析漏洞

阿帕奇对于解析的文件扩展名会从右往左开始解析,当最右边后缀无法解析时,会往左识别,直到识别合法才进行解析

7.白名单配合文件包含漏洞

文件包含漏洞会将任意类型的文件当作php文件进行解析,如果文件中包含了php代码,则其中的php代码将会执行。

    <?php
       $a=$_GET['inc'];
       include($a);
    ?>

 上传一个图片马,通过文件包含包含此文件

参考博客:http://t.csdnimg.cn/oBT7b

相关文章:

  • TFHE中的数据结构Torus
  • uni-app声生命周期
  • Java小白入门到实战应用教程-循环结构
  • 如何获得某个Window画面所属包名packageName和用户userId
  • 一步步教你学会如何安装VMare虚拟机(流程参考图)
  • 8卦的形象记忆法
  • 【OpenCV C++20 学习笔记】扫描图片数据
  • 数据结构之判断二叉树是否为搜索树(C/C++实现)
  • 如何使用 Django 搭建 Web 服务器
  • JVM类加载机制详解
  • LwIP入门实战 — 1 计算机网络简述
  • 我在Vscode学Java集合类
  • Nest.js学习(一)
  • C# 数组常用遍历方式
  • 培训第十五天(shell脚本与sed的学习)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Android 控件背景颜色处理
  • Angular Elements 及其运作原理
  • Angular6错误 Service: No provider for Renderer2
  • Cumulo 的 ClojureScript 模块已经成型
  • IP路由与转发
  • k个最大的数及变种小结
  • React-flux杂记
  • SQLServer之索引简介
  • vue-cli在webpack的配置文件探究
  • 测试如何在敏捷团队中工作?
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 记一次和乔布斯合作最难忘的经历
  • 力扣(LeetCode)22
  • 前端之React实战:创建跨平台的项目架构
  • 如何在 Tornado 中实现 Middleware
  • 算法之不定期更新(一)(2018-04-12)
  • 自动记录MySQL慢查询快照脚本
  • 浅谈sql中的in与not in,exists与not exists的区别
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (九十四)函数和二维数组
  • (六)激光线扫描-三维重建
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)jdk与jre的区别
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)德国人的记事本
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net 提取注释生成API文档 帮助文档
  • //解决validator验证插件多个name相同只验证第一的问题
  • /proc/vmstat 详解
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @ResponseBody