目录
一、文件上传漏洞
1.什么是文件上传漏洞
常见的WebShell
2.文件上传产生漏洞的原因
二、文件上传绕过
(一)客服端绕过-JS验证
1.前端验证
upload-labs第一关
(二)绕过黑名单验证
黑名单验证
1.特殊解析后缀
upload-labs第三关
2. .htaccess解析
upload-labs第四关
3.大小写绕过
upload-labs第六关
4.空格绕过
upload-labs第七关
5. .号绕过
upload-labs第八关
6.特殊符号
upload-labs第九关
7.双写后缀绕过
upload-labs第十关
8.路径拼接绕过
upload-labs第十关
(三)绕过白名单验证
白名单绕过
1.MIME绕过
upload-labs第二关
2.%00截断绕过
(1)GET型00截断
(2)POST型00截断
upload-labs第十二关
编辑 (四)其他
1.图片马(图片Webshell上传)
图片Webshell制作
编辑upload-labs第十四关
2. 文件头图片格式绕过
3.文件头GIF89a绕过
4.二次渲染
5.条件竞争
学习参考:
文件上传漏洞详解_常见上传漏洞-CSDN博客
文件上传漏洞详解-CSDN博客
WEB入门——文件上传漏洞_htaccess文件上传漏洞-CSDN博客
工具准备:中国蚁剑、搭建upload-labs环境
upload-labs 靶机下载地址:https://github.com/c0ny1/upload-labs
一、文件上传漏洞
1.什么是文件上传漏洞
文件上传漏洞是web系统中常见的一种功能,通过文件上传能实现上传图片、视频,以及其他类型的文件。如果恶意用户上传了可执行的文件或者脚本,就可以利用上传的恶意文件控制整个网站,这个恶意文件被称为 WebShell ,也可称为一种网页后门。
常见的WebShell
- 拥有较完整功能的webshell,一般称为大马。
- 功能简易的webshell称为小马。
- 此外,一句话木马、菜刀马、脱库马等等,是对于webShell功能或者特性的简称。
<?php @eval($_POST['pass']);?> //php的一句话木马
<%eval request ("pass")%> //asp的一句话木马
<%@ Page Language="Jscript"%> //aspx的一句话木马
<%eval(Request.Item["pass"],"unsafe");%>
2.文件上传产生漏洞的原因
- 服务器配置不当
- 文件上传限制被绕过
- 开源编辑器的上传漏洞
- 文件解析漏洞导致文件执行
- 过滤不严或被绕过
二、文件上传绕过
文件上传成功绕过后,使用蚁剑创建连接,就可以直接访问服务器。
(一)客服端绕过-JS验证
1.前端验证
JS防护:将上传的文件进行一个格式的验证。
但JS类的防护是用户可以控制的,所以前端的所有验证都是不安全的。
upload-labs第一关
上传一个php的一句话木马,弹窗 只能上传.jpg|.png|.gif类型的文件
查看源代码,发现只是在客户端用JS做了过滤限制
上传.jpg文件,使用bp抓包,修改后缀为.php,直接绕过就能上传成功
(二)绕过黑名单验证
黑名单验证
黑名单:服务端明确不让上传的格式后缀,例如:rar、php、zip等。
1.特殊解析后缀
特殊解析后缀绕过:
由于黑名单过滤规则不严谨,在某些特定的情况下的后缀也能够被当作php文件进行解析。
例如:PHP2、php3、php4、phtml、pht等情况。
upload-labs第三关
通过源码得知,禁止.asp、.aspx、.php、.jsp类型进行上传。
可以通过上传其他文件扩展名进行绕过,实现文件上传。
此处上传了一个.pht文件当作php文件进行解析。
2. .htaccess解析
黑客可以将PHP代码保存在.inc或.txt文件中,然后使用.htaccess将这些文件的MIME类型设置为application/x-httpd-php,将它们伪装成有效的PHP文件。
htaccess文件:Apache服务器中的一个配置文件,它负责相关目录下的网页配置。
通过.htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
upload-labs第四关
.htaccess文件中的内容为:
SetHandler application/x-httpd-php .txt
//将所有的.txt文件解析为php。
//设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行。不符合则报错。
先上传.htaccess文件
再上传一个.txt一句话木马文件,即可执行
3.大小写绕过
原理:
Windows系统下,对于文件名中的大小写不敏感。 //test.php和TeSt.PHP是一样的。
Linux系统下,对于文件名中的大小写敏感。 //test.php和 TesT.php是不一样的。
upload-labs第六关
查看源代码,可以用大小写绕过
bp抓包后,修改后缀名为.PhP上传文件。
4.空格绕过
原理:
Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。
upload-labs第七关
查看源代码,可以用空格绕过。
使用bp抓包,在文件名后加空格
5. .号绕过
原理:
Windows系统下,文件后缀名最后一个点会被自动去除。
upload-labs第八关
查看源代码,可以用.号绕过
使用bp抓包,在文件名后加.号
6.特殊符号
原理:
Windows系统下,如果上传的文件名中1.php::$DATA会在服务器上生成一个1.php的文件,其中内容和所上传文件内容相同,并被解析。
upload-labs第九关
查看源代码,可以用特殊符号绕过
使用bp抓包,在文件名后加::$DATA
7.双写后缀绕过
原理:
服务端可能存在将后缀替换为空的情况,但是在编辑过滤的时候可能只过滤了一次,就可以通过双写后缀绕过。
upload-labs第十关
查看源代码,发现 若上传的文件后缀在禁止的列中,那么就将后缀替换为空,而这里只过滤(从左到右)一次,那么就可以通过双写进行绕过
使用bp抓包,用pphpph双写绕过
8.路径拼接绕过
原理:
在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。
upload-labs第十关
查看源代码,没有对上传的文件进行重命名。
使用bp抓包,在文件名后面加. .(点空格点)绕过
程序先删除了一个点,再删除一个空格。经过处理后 文件名变成了.php.即可绕过
(三)绕过白名单验证
白名单绕过
白名单:服务端明确可以上传的格式后缀,例如:jpg、png、jpeg等。
1.MIME绕过
上传对文件的MIME-Type类型做了限制,可通过 burpsuit 将其他类文件类型修改为如:Content-Type:image/gif 和 image/jpeg 等允许上传的文件类型。
利用Burp抓包,将文中的Content-Type改成允许的类型
Content-Type: image/gif(gif图像)
Content-Type: image/jpeg(jpg图像)
Content-Type: image/png(png图像)
//常用的文件上传类型的 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 劢画)
video/x-msvideo (AVI文件)
audio/basic (au声音文件)
audio/midi,audio/x-midi (midi音乐文件)
audio/x-pn-realaudio (realaudio音乐文件)
application/octet-stream(二进制数据)
application/pdf(PDF 文档)
application/(编程语言) 该种语言的代码
application/msword(Microsoft Word 文件)
message/rfc822(RFC 822 形式)
multipart/alternative(HTML 邮件的 HTML 形式和纯文本形式,相同内容使 用不同形式表示)
application/x-www-form-urlencoded(POST 方法提交的表单)
multipart/form-data(POST 提交时伴随文件上传的表单)
upload-labs第二关
查看源代码,使用$_FILE[‘upload_file’][‘type’]获取上传文件的MIME-Type类型——为jpg、png、gif图像。
使用bp抓包,改上传文件的MIME-Type类型为其中之一即可绕过
2.%00截断绕过
%00只能用于php版本低于5.3的,在PHP5.3之后的版本中完全修复了00截断。
原理:
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。
系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。
(1)GET型00截断
GET型提交的内容会被自动进行URL解码。
上传jpg文件,用bp抓包,在抓包头加1.php%00
save_path.../upload/1.php%00
(2)POST型00截断
在POST请求中,%00不会被自动解码,需要在16进制中进行修改00.
upload-labs第十二关
//只允许上传.jpg|.png|.gif类型文件
在抓包头加1.php%00
在Hex中 将3030改为0000(此处传不上去,应该是PHP版本高于5.3)
(四)其他
1.图片马(图片Webshell上传)
服务器在后台使用函数来判断上传的文件内容是否为图片。
如果是WebShell文件仅仅是修改了后缀,可能会被pass掉。故上传的内容必须得有真实的图片内容。
图片Webshell制作
最直接方法:图片用notepad++打开,在尾行添加一句话木马
upload-labs第十四关
查看源代码,定义了一个函数getReailFileType
用来检测文件类型。只能上传jpg\png\gif类型文件
此时 上传只修改后缀的木马文件就不行
上传真正的图片马即可
2. 文件头图片格式绕过
也可以说是一种图片马
图片的格式在防护中通常不使用后缀为判断依据,有时后缀为图片格式 但文件头是不对的。
//文件头是文件开头的一段二进制码(所有的文件都是以二进制的形式进行存储的)
JPEG (jpg) 文件头:FF D8 FF E1
PNG (png) 文件头:89 50 4E 47
GIF (gif) 文件头:47 49 46 38
一句话木马文件用WinHex十六进制编辑器打开,修改需要的文件头
此处改为jpg格式
upload-labs第十四关
此时该木马文件可上传成功
3.文件头GIF89a绕过
“GIF89a”经常作为“Graphics Interchange Format number 89A”的缩写来使用,中文表示:“图形交换格式编号89A”
原理:
在文件内容的起始位置加上一个GIF89a,文件就会被认为是一个图片。
php的getimagesize()函数、getReailFileType()函数
也检测不出来这个“虚假”的图片是无效的。
upload-labs第十四关
上传只修改后缀的木马文件,bp抓包后在木马开头添加GIF89a,即可上传成功
4.二次渲染
二次渲染就是原来上传的图片马,再上传到本地时候,中间会对图片进行渲染。
即原来插入的一句话木马会被改变,但是二次渲染对图片的内容有一部分是不改变的,所以只需要找到没有改变的那部分,然后插一入句话木马,即可。
5.条件竞争
网站逻辑:
1、网站允许上传任意文件,然后检查上传文件是否包含Webshell,如果包含删除该文件。
2、网站允许上传任意文件,但如果不是指定类型,那么使用unlink删除文件。
在删除之前访问上传的php文件,从而执行上传文件中的php代码。