php安全攻防利用文件上传漏洞与绕过技巧详解

目录
  • 前言
  • 文件上传漏洞的一些场景
    • 场景一:前端js代码白名单判断.jpg|.png|.gif后缀
    • 场景二:后端PHP代码检查Content-type字段
    • 场景三:代码黑名单判断.asp|.aspx|.php|.jsp后缀
    • 场景四:代码扩大黑名单判断
      • 绕过方式——htaccsess:
      • 绕过方式——大小写绕过:
    • 场景五:一些复合判断
      • 空格、点绕过(windows)
      • ::$DATA绕过(windows)
      • 双写绕过
      • %00截断
      • %0a绕过
      • 图片马绕过
      • 二次渲染绕过
      • 条件竞争
      • /.绕过

前言

文件上传漏洞大多出现在可以进行文件上传的地方,如用户头像上传,文档上传处等。该漏洞是一个危害十分大的漏洞,通过文件上传,攻击者可以上传webshell并进行getshell操作,从而获得系统shell,可执行任意命令。也为后续大型木马的上传,特权提升提供了一个良好的基础。

文件上传漏洞的一些场景

接下来针对文件上传漏洞的一些waf过滤的场景进行说明并进行绕过和利用。

场景一:前端js代码白名单判断.jpg|.png|.gif后缀

在该场景下,防御的姿势是通过js代码对上传的文件后缀进行判断,如果不是.jpg|.png|.gif这三个后缀的文件则不允许上传至后台

绕过方式:

将带有一句话木马的文件后缀名改为xxx.jpg|png|gif,在上传处通过BurpSuite进行包拦截并改包,将文件后缀名改为php|jsp等脚本的后缀。上传成功后访问该文件的路径即可getshell。

场景二:后端PHP代码检查Content-type字段

在该场景下,防御的姿势是通过js代码对上传文件请求的Content-type字段进行检查,如果不是image/jpeg则不允许上传至后台

绕过方式:

将上传一句话木马文件的request包进行拦截,添加或修改Content-type字段为image/jpeg

场景三:代码黑名单判断.asp|.aspx|.php|.jsp后缀

在该场景下,防御姿势是通过后台代码对上传的文件后缀进行判断,如果是.asp|.aspx|.php|.jsp这四个后缀的文件则不允许上传

绕过方式:

当apache的配置文件httpd.conf中存在如下配置时:

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

说明可以通过上传.phtml|.phps|.php5|.pht这些后缀名的文件,且他们都会被解析称后缀为.php的文件。所以可以尝试使用上传xxx.php5这类的文件进行绕过

关于AddType命令的作用:

AddType 指令

作用:在给定的文件扩展名与特定的内容类型之间建立映射
语法:AddType MIME-type extension [extension] …
AddType指令在给定的文件扩展名与特定的内容类型之间建立映射关系。MIME-type指明了包含extension扩展名的文件的媒体类型。
AddType 是与类型表相关的,描述的是扩展名与文件类型之间的关系。AddType 是与类型表相关的,描述的是扩展名与文件类型之间的关系。

场景四:代码扩大黑名单判断

在该场景下,防御姿势是通过后台代码对上传的文件后缀进行判断,如果是.php|.php5|.php4|.php3|.php2|.php1|.html|.htm|.phtml|.pht|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|.pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf"这些后缀的文件则不允许上传

绕过方式——htaccsess:

使用.htaccsess文件进行绕过

.htaccsess文件的作用:

.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在httpd.conf文件中配置。

.htaccsess文件的使用条件:

mod_rewrite模块开启。
AllowOverride All

构造.htaccess文件,内容如下:

AddType application/x-httpd-php .jpg

这里代码的意思可以让 .jpg后缀名文件格式的文件名以php格式解析,因此达到了可执行的效果。所以我们可以把要上传的php文件的后缀名改为.jpg格式从而绕过

绕过方式——大小写绕过:

如果在黑名单中没有针对大小写进行限制,则可以进行大小写绕过,如将.php后缀改为.PhP|.PHP后缀

场景五:一些复合判断

在该场景下,防御姿势除了基本的黑/白名单外,还包括了对一些特定字符的限制,具体情况可以进行fuzz或者有条件可以进行代码审计

空格、点绕过(windows)

当接收文件时,后台代码的限制条件中没有去除文件名首尾的空格(或是没有对.进行拆分)时,可以利用windows系统的命名规则进行绕过:如,将文件后缀改为xxx.phpxxx.php.xxx.php .

在windows下xx.jpg[空格] 或xx.jpg.这两类文件是不允许存在的,若这样命名,windows会默认去除空格或点

还有些情况具体就需要看代码逻辑,比如如果代码只删除一次点且只去除一次首尾空格,在windows环境下就可以用xxx.php. .进行绕过

::$DATA绕过(windows)

::$DATA绕过同样利用了windows的特性

NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。

即在php+windows的环境下,如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名。

双写绕过

当防御的代码中存在将某些特定后缀进行空字符替换时(如利用str_ireplace函数将.php|.jsp等后缀替换为空字符)

这时候可以将后缀双写,即将php改成pphphp

%00截断

00截断绕过方式需要满足以下条件

php版本小于5.3.4
php.ini的magic_quotes_gpc为OFF状态
使用move_uploaded_file函数且参数受用户控制

此时move_uploaded_file函数遇到0x00会截断

可以将上传文件后缀改为xx.php%00进行绕过

%0a绕过

%0a绕过方式需要满足以下条件

Apache httpd 2.4.0至2.4.29
FileMatch正则匹配.php|.php5等后缀

该版本apache会通过$匹配后缀,而$匹配时会正则匹配某字符串结尾或以换行符结尾的一个字符串,即php[换行符]会被匹配成php

可以将上传文件后缀改为xx.php%0a进行绕过

图片马绕过

window的cmd命令制作图片马

copy 1.jpg /b + shell.php /a shell.jpg

或是利用其他图片马生成器生成

二次渲染绕过

判断图片格式后用image函数进行二次渲染

绕过方式:

抓包找到二次渲染中未被改动的地方,将一句话马插入该地方,.jpg|.png|.gif三种文件格式不同,所以构造马的方式也不同

注:gif文件最简单,直接用ue等16进制编辑器就可以改,但是jpg和png需要特殊的构造脚本

先将一张正常的jpg图片上传,上传后将服务器存储的二次渲染的图片保存下来。
将保存下来经过服务器二次渲染的那张jpg图片,用此脚本进行处理生成payload.jpg
然后再上传payload.jpg

条件竞争

当上传文件逻辑为:先move_uploaded_file函数将上传文件临时保存,再进行判断,如果不在白名单里则unlink删除,在的话就rename重命名。此时会存在条件竞争

绕过方法:
用burp开启两个intruder模块,一个用于重复上传,另一个用于重复访问。会有一定记录返回执行结果

/.绕过

move_uploaded_file函数参数可控时,可以尝试/.绕过,因为该函数会忽略掉文件末尾的/.,所以可以构造save_path=1.php/.,这样file_ext值就为空,就能绕过黑名单,而move_uploaded_file函数忽略文件末尾的/.可以实现保存文件为.php

以上就是php安全攻防利用文件上传漏洞与绕过技巧详解的详细内容,更多关于php文件上传漏洞利用与绕过技巧的资料请关注我们其它相关文章!

时间: 2021-10-11

PHP编程中的常见漏洞和代码实例

不是固若金汤,随着PHP的广泛运用,一些黑客们也在无时不想找PHP的麻烦,通过PHP程序漏洞进行攻击就是其中一种.在节,我们将从全局变量,远程文件,文件上载,库文件,Session文件,数据类型和容易出错的函数这几个方面分析了PHP的安全性. 如何通过全局变量进行攻击? PHP中的变量不需要事先声明,它们会在第一次使用时自动创建,它们的类型根据上下文环境自动确定.从程序员的角度来看,这无疑是一种极其方便的处理方法.一旦一个变量被创建了,就可以在程序中的任何地方使用.这个特点导致的结果就是程序员很

CTF命令执行及绕过技巧

前言 今天是代码审计部分的一个技巧补充!前些阵子做了sql注入回顾篇系列!今天开启php代码审计系列! 今天内容主要是CTF中命令注入及绕过的一些技巧!以及构成RCE的一些情景! 正文 在详细介绍命令注入之前,有一点需要注意:命令注入与远程代码执行不同.他们的区别在于,远程代码执行实际上是调用服务器网站代码进行执行,而命令注入则是调用操作系统命令进行执行. 虽然最终效果都会在目标机器执行操,但是他们还是有区别的,基于这个区别,我们如何找到并利用方式也是有所不同的! 代码执行 代码执行的几种方式

由php中字符offset特征造成的绕过漏洞详解

php中的字符offset特性 php中的字符串存在一个非常有趣的特性,php中的字符串也可以像数组一样进行取值. $test = "hello world"; echo $test[0]; 最后的结果就是h. 但是上述的这种特性有时会有意想不到的效果,看下面这段代码 $mystr = "hello world"; echo $mystr["pass"]; 上述的代码的输出结果是h.这是为什么呢?其实很简单,和很多其他的语言一样,字符串在php中

PHP序列化/对象注入漏洞分析

本文是关于PHP序列化/对象注入漏洞分析的短篇,里面讲述了如何获取主机的远程shell. 如果你想自行测试这个漏洞,你可以通过 XVWA 和 Kevgir 进行操作. 漏洞利用的第一步,我们开始测试目标应用是否存在PHP序列化.为了辅助测试,我们使用了Burpsuite的SuperSerial插件,下载地址在 这里 .它会被动检测PHP和Java序列化的存在. 分析 我们检测到了应用里使用了PHP序列化,所以我们可以开始确认应用代码里是否含有远程代码执行漏洞.需要注意的是,序列化对象是从参数"r

php文件上传你必须知道的几点

本篇文章主要说明的是与php文件上传的相关配置的知识点.PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir.upload_max_filesize.post_max_size等选项,下面一一说明. 打开php.ini配置文件找到File Uploads file_uploads = On 默认允许HTTP文件上传,此选项不能设置为OFF. upload_tmp_dir = 默认为空,此选项在手动配置PHP运行环境时,也容易遗忘,如果不配置这个选项,文件上传功能就

Angular2-primeNG文件上传模块FileUpload使用详解

近期在学习使用Angular2做小项目,期间用到很多primeNG的模块. 本系列将结合实战总结angular2-primeNG各个模块的使用经验. 文件上传模块FileUploadModule 首先要在使用该组件的模块内导入文件上传模块 本例中为: admin.module.ts import {FileUploadModule} from 'primeng/primeng'; @NgModule({ imports: [FileUploadModule] }) 在需要使用上传功能的组件的HT

AngularJS 文件上传控件 ng-file-upload详解

网上可以找到的 AngularJS 的文件上传控件有两个: angular-file-upload:https://github.com/nervgh/angular-file-upload ng-file-upload:https://github.com/danialfarid/ng-file-upload 这两个非常类似,连js文件的结构都是一样的.核心的js是.min.js,还都有一个-shim.min.js,用来支持上传进度条和上传暂停等高级功能. 按道理讲shim.js应该是可加可不

学习使用AngularJS文件上传控件

前段时间做项目遇到一个需求是上传文件,大概需要实现的样式是这样子的,见下图: 需要同时上传两个文件.并且规定文件格式和文件大小.因为前端框架使用angular,且不想因为一个上传功能又引入一个jquery,所以在网上查找基于angular的上传控件,因为angular还算比较新,貌似都没有太成熟的插件,网上的教程也大多是复制粘贴,总之没起倒多大的作用...但是皇天不负有心人,最后还是让我遇到了这个功能强大的插件,让我有种相见恨晚的感觉呀,依靠官方文档和师兄的帮助,终于搞清楚了基本的使用方法.好东

表单正则验证及文件上传验证功能

表单正则验证主要是用来对表单提交信息的过滤,防止sql注入(比如登录界面),上传的文件也需要进行文件名后缀和大小进行验证,下面是一个简单的表单验证 header("Content-type:text/html;charset=utf-8"); $user = isset($_POST['user'])?$_POST['user']:null; $password = isset($_POST['password'])?$_POST['password']:null; $arr = ar

springboot 文件上传大小配置的方法

springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean 首先第一种: application.properties中添加 spring.http.multipart.maxFileSize=10Mb spring.http.multipart.maxRequestSize=10Mb maxFileSize 是单个文件大小 maxRequestSize是设置总上传的数据大小 这就可以了. 根据自己需求定义吧,Mb和Kb都可以,大小写也都随意,L

JavaWeb实现文件上传下载功能实例解析

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

javascript html5移动端轻松实现文件上传

PC端上传文件多半用插件,引入flash都没关系,但是移动端要是还用各种冗余的插件估计得被喷死,项目里面需要做图片上传的功能,既然H5已经有相关的接口且兼容性良好,当然优先考虑用H5来实现. 用的技术主要是: ajax FileReader FormData HTML结构: <div class="camera-area"> <form enctype="multipart/form-data" method="post">

ASP.NET文件上传控件Uploadify的使用方法

对于文件上传来说,有很多种实现方式,如传统的表单方式,现在流行的flash方式,甚至还有纯JS方式,之所以有这些方式来实现文件上传,我想主要原因是因为,传统的上传对于大文件支持不够,因为它是单线程同步机制,当大文件通过HTTP方式发送到服务端时,对于服务端站点的主线程影响比较大,会产生阻塞,所以,现在很多上传控制都是异步,多线程的方式去实现的. 今天来介绍一个文件上传控制,它就是Uploadify,它应该是flash的异步上传工具,对于大文件支持还不错,所以,我选择了它. 相关API介绍 upl

asp.net fileupload控件上传文件与多文件上传

1.前台文件 Default.aspx: <%@ Page Language="C#" AutoEventWireup="true"CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.

asp.net 文件上传实例汇总

ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. Test.aspx关键代码: 复制代码 代码如下: <form id="form1" runat="server">     <asp:FileUpload ID="FileUpload1" runat="server" />