文件上传常见绕过方式
文件上传
检测机制
客户端检测
一般是在网页上写一段js脚本,用js脚本去检测,校验文件的后缀名,有白名单或黑名单
绕过方式:可以通过抓包来修改文件后缀名来绕过前端验证或者通过关闭js尝试绕过
服务端检测
就是在后端代码中写入有关文件检测机制的代码
常见手段
- 检测Content-Type(内容类型)
- 检查后缀(主流)
- 检查文件头
php文件上传的相关函数
$_FILES['myFile']['name'] 客户端文件的原名称。
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量)
trim() — 去除字符串首尾处的空白字符(或者其他字符)
strrchr — 查找指定字符在字符串中的最后一次出现,返回字符串的一部分
substr(string $string, int $offset, ?int $length = null)---返回字符串 string 由 offset 和 length 参数指定的子字符串。
stripos — 查找字符串首次出现的位置(不区分大小写)
getimagesize() 函数将确定任何支持的指定图像文件的大小,并返回尺寸以及文件类型和 height/width 文本字符串,以在标准 HTML IMG 标签和对应的 HTTP 内容类型中使用。
imagecreatefromjpeg()--创建一块画布并且从GIF文件或者URL地址载入一副画像
绕过机制
文件类型绕过
- 直接使用图片马,之后抓包修改文件后缀名为.php
在txt中写一个一句话木马,找一张图片放在一个文件夹中,使用cmd打开
将a.jpg和1.txt合并为123.jpg
copy a.jpg/b + 1.php/a 123.jpg
- 直接写一个一句话木马之后抓包修改Content-Type
补充知识
png图片文件包括8个字节:89 50 4E 47 0D 0A 1A 0A
jpg图片文件包括2个字节:FF D8
GIF图片包含6个字节; 47 49 46 38 39|37 61即为GIF89(7)a
不靠谱的黑名单
若有一些不靠谱的黑名单的话,除了php后缀会被解析为php文件,在默认状态下,php3,php4,php5,phtml都是会被解析为php的
.htaccess绕过
.htaccess
是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess
主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
.htaccess
的用途范围主要针对当前目录。
注意:Apache默认是不开启的
可以先上传一个.htaccess文件,编写一个将.jpg文件当作php文件的命令
AddType application/x-httped-php .jpg
之后上传一个图片码
大小写绕过
不用多说,懂得都懂
文件后缀加空格绕过
有些后端没有对文件名的进行去除空格处理,而黑名单中又没有对这样的文件后缀名过滤,当我们上传一个类似于111.php
的文件这样就会成功上传成功到服务器的目录中
在服务器的目录中,这个111.php
会被系统自动去除空格变为111.php
,从而成功被当作一个php文件
文件后缀加.绕过
与上一个方法类似,上传一个111.php.
会绕过黑名单机制,同时在服务器目录中,会自动去除后面那个.
::$DATA绕过
这是Windows下NTFS文件系统的一个特性,即NTFS文件系统的存储数据流的一个属性 DATA 时。当我们访问a.asp:: D A T A 时,就是请求 a . a s p 本身的数据,如果 a . a s p 还包含了其他的数据流,比如 a . a s p : l a k e 2. a s p ,请求 a . a s p : l a k e 2. a s p : : DATA时,就是请求 a.asp 本身的数据,如果a.asp 还包含了其他的数据流,比如 a.asp:lake2.asp,请求 a.asp:lake2.asp:: DATA时,就是请求a.asp本身的数据,如果a.asp还包含了其他的数据流,比如a.asp:lake2.asp,请求a.asp:lake2.asp::DATA,则是请求a.asp中的流数据lake2.asp的流数据内容。
我们可以利用这个windows特性,在文件后缀名中添加::$DATA
,进行绕过黑名单,当然在服务器的目录中是会去除::$DATA
恢复文件本身
构造文件后缀绕过
这个方法是利用了有些过滤它只进行一次,而不是循环过滤
下面的依次从上往下进行执行
当我我们输入111.php. .
先是去除末尾的点变为111.php.
之后去除首尾空格变为111.php.
,进而绕过黑名单实现文件上传
双写绕过
.pphphp
的后缀名,当有些机制会将php转为空,那么.pphphp
就会变为.php
实现绕过
%00截断或00截断
了解%00前先了解0x00,0x00实际上是一个十六进制表示方式,实际上就是表示ASCII码值为0,有些函数在处理这个字符的时候会把这个字符当作结束符
%00和00截断原理是一样的,只不过%00是经过url编码的,%00解码之后就是0x00截断了
在POST传参是不会进行 url解码的,GET传参会进行url解码,所以在POST传参时使用0x00
使用条件
- php版本小于5.3.29
- magic_quotes_gpc=Off
IIS 6.0解析漏洞
-
IIS6.0除了将ASP后缀当作ASP进行解析的同时,当后缀名为
.asa
,.cer
,.cdx
也会当作asp去解析,这是因为IIS6.0在应用程序拓展中默认设置了.asa
,.cer
,.cdx
都会调用asp,dll -
test.asp;.jpg
会当作asp进行解析
test.asp/123.jpg
会当作asp进行解析
比如请求/aaa.asp;xxx.jpg
从头部查找.
号,获取.asp;xxx.jpg
查找分号,如果有则截断
查找/
,如果有则截断
最后将保留的.asp
字符串,反馈给了asp.dll处理
CGI解析漏洞
Ngnix默认是以CGI的方式支持PHP解析,如果cgi.fix_pathinfo=1(默认是开启的),当访问一个xxx.com/php.jpg/.php,会将这个php.jpg
当作php文件执行
当然在IIS7.0、IIS7.5、 Lighttpd等web容器中会经常出现这样的解析漏洞