文件上传入门

推荐文章:超详细文件上传漏洞总结分析-腾讯云开发者社区-腾讯云 (tencent.com)

原理

我只能浅显地说:在要上传的文件里构造语句并按照特定的方式进行上传,以达到攻击者的目的。

限制措施及绕过

前端检测

原理

前端检测主要是通过JavaScript语句。

附:如果检测失败则不会发出请求,也就是不会发包。

判断

前端验证通过以后,表单成功提交后会通过浏览器发出─条网络请求,但是如果前端验证不成功,则不会发出这项网络请求;可以在浏览器的网络元素中查看是否发出了网络请求。

绕过

方法一:改变前端

F12修改source的JavaScript代码,或者直接禁用JavaScript

方法二:骗过前端

文件名是name.png,在bp抓包后改成name.php

须知:只有前端通过后才能发包,bp这时才能抓包

MIME绕过

基础

概念

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。

常见的MIME类型

text/plain (纯文本) text/html (HTML文档) text/javascript (js代码) application/xhtml+xml (XHTML文档) image/gif (GIF图像) image/jpeg (JPEG图像) image/png (PNG图像) video/mpeg (MPEG动画) application/octet-stream (二进制数据) application/pdf (PDF文档)

检测方式

        在文件上传过程中,服务端会针对我们的上传的文件生成一个数组,这个数组其中有一项就是这个文件的类型file_type;服务端对文件进行检测时,就是通过检测脚本中的黑白名单和这个数组中的file_type进行对比,如果符合要求就允许上传这个文件。

绕过

name.php,bp抓包直接改成image/png等等

.htaccess文件解析漏洞

基础

原理

.htaccess文件(或者"分布式配置文件") ,全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法,即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

前提

web具体应用没有禁止.htaccess文件的上传,同时web服务器提供商允许用户上传自定义的.htaccess文件

利用方式

上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。

绕过

第一步:

先命名成a.htaccess,bp抓包改成.htaccess即可,内容为:

<FilesMatch "js">
SetHandler application/x-httpd-php
</FilesMatch>

再写个木马,改名为name.js

此时js文件会按照php文件被解析,也就是name.js被当成php文件执行,然后开蚁剑。

注意点:

.htaccess是全名,但不能直接在Windows命名,在bp上改

补录:https://we11s.github.io/posts/154257042/

.htaccess使用模板

1
2
3
4
5
6
7
8
#对于php
AddType application/x-httpd-php .html #将html文件作为php文件进行解析
#对于python
AddHandler cgi-script .py #将html文件作为php文件进行解析
Options +ExecCGI
#对于Perl
AddHandler cgi-script .cgi .pl
Options +ExecCGI

.user.ini文件包含漏洞

基础

.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们可以自定义除了PHP_INI_SYSTEM以外的模式,在执行php代码之前,系统会对.user.ini先做一个执行,然后才执行其他的php文件。

我们这边利用.user,ini先执行auto_prepend_file函数,auto_prepend_file表示在php程序加载第一个php代码前加载的php文件,也就是先加载了a.jpg里面的文件,即一句话木马。

原文链接:https://blog.csdn.net/hxhxhxhxx/article/details/107165508

须知:.user.ini配置文件是PHP的,可以在全部环境里生效,而.htaccess配置文件是Apache特有

利用

先上传a.user.ini.jpg文件,内容:

GIF89a
//auto_append_file=test1.png
auto_prepend_file=test1.png

第一行绕过文件头检测,第二行可以不写。

bp抓包改名为.user.ini

再上传test1.png,没必要改名,其内容会被当做PHP文件内容执行。

这句话:auto_prepend_file表示在php程序加载第一个php代码前加载的php文件

我们要先找到一个php文件,自己传会被Unicode化,那看看是否有原有的:

url/upload/index.php 蚁剑连

后端检测_文件头检测漏洞

基础

原理

在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)实际上都有一片区域来显示这个文件的实际用法,这就是文件头标志。我们可以通过16进制编辑器打开文件,添加服务器允许的文件头以绕过检测。

常见文件头

GIF:47 49 46 38 39 61 png:89 50 4E 47 0D 0A 1A 0A JPG:FF D8 FF E0 00 10 4A 46 49 46

GIF 文件头解码结果:GIF89a PNG 文件头解码结果:\x89PNG\r\n\x1A\n JPG 文件头解码结果:ÿØÿà\x00\x10JFIF

在进行文件头绕过时,我们可以把上面的文件头添加到我们的一句话木马内容最前面,达到绕过文件头检测的目的。

附:最好文件头和代码(木马)之间有个空格

后端检测_00截断

基础

虽然web应用做了校验,但是由于文件上传后的路径用户可以控制,攻击者可以利用手动添加字符串标识符0X00的方式来将后面的拼接的内容进行截断,导致后面的内容无效,而且后面的内容又可以帮助我们绕过黑白名单的检测。

可是0x00跟%00有什么关系呢?

%00经过URL解码后就是0x00,二者的意思都是空字符,表示一个字符串的结束。我们就可以根据源码利用%00实现.php后缀

示例:ctfhub

源码

最关键的是这句代码:

$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;

只要在road的值里使用空字符即可,因为GET会编码,所以用%00

payload:

?road=/var/www/html/upload/test1.php%00

至于下面的文件名,最多判断一下后缀,把后缀补过去也会被%00截断,所以在白名单的范围里里命名即可

后端检测_后缀名检测漏洞

原理

通常是针对文件的扩展名后缀进行检测,主要是通过黑白名单进行过滤检测,如果不符全过滤规则则不允许上传。

黑名单

一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。

双写绕过

有时后端会把敏感字符替换为空,这就可以双写绕过了,比如name.phphpp

解析漏洞
.htaccess文件解析漏洞- apache解析漏洞

利用.htaccess可以使其他类型的文件按照PHP文件来执行

apache:技术向!Apache解析漏洞 - 知乎 (zhihu.com)

  1. 简单来说就是一个配置(AddHandler):后缀可以是其他的,只要文件名里有.php,就按照PHP文件执行
  2. 使用.php\x0a,具体看上面链接
IIS7.0 | IIS7.5 | Nginx的解析漏洞

Nginx拿到文件路径(更专业的说法是URI)/test.jpg/test.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/test.jpg/test.php不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件,于是返回Access denied。
  这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项PHP可以对文件路径进行修理。
  举个例子,当php遇到文件路径/1.jpg/2.txt/3.php时,若/1.jpg/2.txt/3.php不存在,则会去掉最后的/3.php,然后判断/1.jpg/2.txt是否存在,若存在,则把/1.jpg/2.txt当做文件/1.jpg/2.txt/3.php,若/1.jpg/2.txt仍不存在,则继续去掉/2.txt,以此类推。

原文链接:https://blog.csdn.net/weixin_45588247/article/details/118889668

简单来说,文件我们可以在存在的文件路径后面加一个虚假的/name.php,这个存在的文件如果是一个图片马,就可能实现getshell。

IIS6.0/IIS5.x解析漏洞解析漏洞
  • 上传文件名:xxx.asp;.jpg

服务器默认不解析;号后面的内容,因此xxx.asp;.jpg被当做asp文件解析

  • 向xxx.asp目录下面上传xxx.jpg

服务器会将xxx.asp目录下的文件都当做asp文件解析

文件上传之IIS6.0解析漏洞_iis6解析漏洞利用-CSDN博客

第一种是文件解析漏洞,如果文件名被修改,可以采用第二种:目录解析漏洞。目录解析漏洞不需要实际的后缀,只需要知道文件名即可

黑名单的漏网之鱼

比如: asacer之类 asp: asa cer aspx jsp: jspx jspf php: php php3 php4 php5 phtml pht exe: exee

利用Windows的命名机制

shell.php. shell.php空格 shell.php:1.jpg shell. php::$DATA shell.php:1.jpg 在windows中,后缀名后面的点和空格都会被删除掉。

白名单

一般有个专门的 whitelist 文件,里面会包含的正常文件。

绕过同黑名单

后端检测_文件头检测漏洞

漏洞原理:

        一般文件内容验证使用getimagesize函数检测,会判断文件是否是一个有效的文件图片,如果是,则允许上传,否则的话不允许上传。 本实验就是将一句话木马插入到一个[合法]的图片文件当中,然后用webshell管理工具进行远程连接。

指令:copy 1.jpg /b + 2.php /a 3.php

/b:指定以二进制格式复制、合并文件,用于图像或者声音类文件

/a:指定以ascii格式复制、合并文件用于txt等文本类文件

这条命令的意思是:通过copy命令,把a.png图片文件,以二进制文件形式添加到a.php文件中,以ASCII文本文件形式输出为3.php文件。

解析图片马需要将图片马被PHP一下,比如文件包含。

    一般解析图片马需要结合解析漏洞或者文件包含才能解析图片马;

条件竞争漏洞

我简单称之为:卡空子。当文件的判断需要过多的时间时,可以卡那个时间间隔执行木马。

由于服务器并发处理(同时)多个请求,假如a用户上传了木马文件,由于代码执行需要时间,在此过程中b用户访问了a用户上传的文件,会有以下三种情况:

1.访问时间点在上传成功之前,没有此文件。

2.访问时间点在刚上传成功但还没有进行判断,该文件存在。

3.访问时间点在判断之后,文件被删除,没有此文件。

二次渲染漏洞

二次渲染原理:

                在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。

绕过:

1、配合文件包含漏洞: 将一句话木马插入到网站二次处理后的图片中,也就是把一句话插入图片在二次渲染后会保留的那部分数据里,确保不会在二次处理时删除掉。这样二次渲染后的图片中就存在了一句话,在配合文件包含漏洞获取webshell。 2、可以配合条件竞争: 这里二次渲染的逻辑存在漏洞,先将文件上传,之后再判断,符合就保存,不符合删除,可利用条件竞争来进行爆破上传

如何判断图片是否进行了二次处理?

    对比要与上传后的图片大小,使用16进制编辑器打开图片查看上传后保留了哪些数据,