H

文件上传漏洞相关

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%

文件上传漏洞​

1 前言​

射击范围环境:https://github.com/c0ny1/upload-labs
环境建设:
1
2
Docker拉C0NY1/上载labs
Docker Run -D -P 80:80上传labs
确定上传漏洞的类型:
20210113094518.png-water_print

文件上传漏洞主要存在于以下方面:
解码后缀意味着该语言具有多个可解释后缀,例如PHP语言的解释后缀为PHP,PHP2,PHP3,等等。
案例混合物,如果系统未严格过滤,则可能会被上部和下情况绕过。
中间件,每个中间件基本都可以解决漏洞。例如,IIS可以执行xxx.asp;jpg为ASP。
系统功能,尤其是Windows的后缀加点,空格和: $数据可以绕过目标系统。
语言漏洞。这三种流行的脚本语言基本上具有00截断漏洞。
double后缀,这与系统和中间件无关,偶尔以代码逻辑存在。

1.1 可解析的后缀​

许多语言具有多种后缀可以解析。当目标站点采用黑名单时,通常是不完整的。
语言可解析后缀ASP/ASPX
ASP,ASPX,ASA,ASAX,ASCX,ASHX,ASMX,CER
php
PHP,PHP5,PHP4,PHP3,PHP2,PHTML,PHT
JSP
JSP,JSPA,JSPX,JSW,JSV,JSPF,JHTML

1.2 中间件漏洞​

1.2.1 IIS​

IIS中有三个分辨率漏洞:
IIS 6.0文件解析xx.asp;jpg
IIS 6.0目录分析xx.asp/1.jpg
IIS 7.5畸形分析xxx.jpg/x.php

1.2.2 Apahce​

有两个与Apache相关的解析漏洞:
%0A(CVE-2017-15715)
未知后缀test.php.xxx

1.2.3 nginx​

有三个NGINX分辨率漏洞:
访问link Plus /xxx.php,即test.jpg /xxx.php
变形分析漏洞测试.jpg%00xxx.php
CVE-2013-4547 test.jpg(非编码空间)\0x.php

1.2.4 tomcat​

有三种类型的tomcat用于上传旁路,其中一些仅限于Windows操作系统。
xxx.jsp/
xxx.jsp%20
xxx.jsp:3360 $数据

1.3 系统特性​

搜索信息后,发现在系统级别,可以通过上传的漏洞来利用以下功能。
Windows下的文件名对病例敏感,Linux下的文件名对病例敏感。
Windows下的广告流式功能上传文件xxx.php: $ data=xxx.php
在Windows中,在文件名的末尾添加了诸如。Space,0x81-0xff的字符,Windows忽略了最终生成的文件。

2 WriteUP​

2.1 PASS - 01​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
脚本类型='text/javascript'
功能checkfile(){
var file=document.getElementsByname('upload_file')[0] .value;
if(file==null || file==''){
警报(“请选择要上传的文件!”);
返回false;
}
//定义允许上传的文件类型
var lesson_ext='.jpg | .png | .gif';
//提取上传的文件类型
var ext_name=file.substring(file.lastindexof('。'));
//判断是否允许上传文件类型
if(lassy_ext.indexof(ext_name)==-1){
var errmsg='不允许上传此文件,请上传' + allo_ext +'类型文件,当前文件类型为:' + ext_name;
警报(errmsg);
返回false;
}
}
/脚本
在前端禁用JS并直接上传Webshell

2.2 PASS - 02​

旁路模拟检测并通过burpsuite修改内容类型
20210113095128.png-water_print

2.3 PASS - 03​

1
2
3
4
5
6
7
$ deny_ext=array('。asp','。aspx','。php','。jsp');
$ file_name=trim($ _ files ['upload_file'] ['name']);
$ file_name=deldot($ file_name); //在文件名的末尾删除点
$ file_ext=strchr($ file_name,'。');
$ file_ext=strtolower($ file_ext); //转换为小写
美元
$ file_ext=trim($ file_ext); //关闭和空
后端过滤器.php和绕过检测,例如.php3,php5,php7,phtml,pht等。
20210113095554.png-water_print

2.4 PASS - 04​

重写文件解析规则绕过。上传一个名为.htaccess的文件,内容如下
1
2
3
fiileMatch '04 .jpg'
Sethandler应用程序/X-HTTPD-PHP
/fiileMatch
上传另一个03.jpg并访问03.jpg,即将其作为PHP文件解析。
20210113100041.png-water_print

2.5 PASS - 05​

仍然是黑名单,并添加了.htaccess,但后缀不均匀,因此可以通过情况绕过。
20210113100129.png-water_print

2.6 PASS - 06​

利用Windows系统的文件名功能。该文件名在末尾添加了点和空格,并写为06.php [space]。
上传后,在Windows系统上保存的最后一个文件名将被删除,并且保存的文件名实际上是06.php
20210113100337.png-water_print

2.7 PASS - 07​

原理与Pass-06相同。在文件名之后添加点,然后将其更改为07.php。
20210113100438.png-water_print

2.8 PASS - 08​

Windows文件流量功能旁路,文件名更改为08.ph: $数据。上传成功后保存的文件名实际上是08.php
窗口环境中的php,如果文件名+ :3360 $数据作为文件流处理,如果: $ data之后的数据作为文件流处理。将无法检测到后缀名称,并且在: $数据之前,文件名
20210113103212.png-water_print

2.9 PASS - 09​

原理与Pass-06相同。上传文件名后,添加点+空间+点,然后将其更改为09.php。
20210113103319.png-water_print

2.10 PASS - 10​

双- 写文件名旁路,将文件名更改为10.pphphp
20210113103439.png-water_print

2.11 PASS - 11​

上传路径名%00 truncate旁路。上传的文件名写入11.jpg,save_path更改为./upload/11.php%00,最后保存的文件为11.php
20210113103600.png-water_print

2.12 PASS - 12​

原理与Pass-11相同,上传路径为0x00。是这次通过帖子或使用00截断的save_path,但是这次需要在二进制系统中修改,因为帖子不会像get一样自动解释%00
使用burpsuite的十六进制函数将save_path更改为表格./upload/12.php [binary 00]
20210113103701.png-water_print

2.13 PASS - 13​

绕过文件标头检查,添加GIF图片的文件标头GIF89A,然后绕过GIF图片检查。
20210113104024.png-water_print

2.14 PASS - 14​

在这里您可以使用getImagesize获取文件类型,也可以直接使用图片马绕过它

2.15 PASS - 15​

在这里,我们使用php_exif模块来确定文件类型,或者您可以直接使用图片马来绕过它

2.16 PASS - 16​

原理:将正常显示的图像上传到服务器。查找呈现图像并将其与原始图像部分进行比较时仍然相同的数据块部分。
将Webshell代码插入本节并上传。具体的实施需要自己编写Python程序。基本上不可能构建可以通过人类尝试绕过渲染函数的图像网状壳。
参考:

2.17 PASS - 17​

使用条件竞争删除文件绕过。
脚本运行时访问网络壳

2.18 PASS - 18​

使用上传重命名竞赛+ Apache分辨率漏洞,成功绕过。
上传名称18.php.7z并快速提交数据包的文件将提示该文件已上传,但尚未重命名。
20210113104348.png-water_print

2.19 PASS - 19​

此级别检查CVE-2015-2348 MOVE_UPLOADED_FILE()00截断,该原理与Pass-11相同,并且上传的文件名被0x00绕过。更改为19.php [二进制00] .1.jpg
20210113104506.png-water_print

2.20 PASS - 20​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ file=空($ _ post ['save_name'])? $ _files ['upload_file'] ['name'] : $ _post ['save_name'];
如果(!is_array($ file)){
$ file=exploit('。',strtolower($ file));
}
$ ext=end($ file);
$ allow_suffix=array('jpg','png','gif');
如果(!
$ msg='上传此后缀文件的用法!';
}别的{
$ file_name=reset($ file)。 '。' 。 $ file [count($ file)-1];
$ temp_file=$ _files ['upload_file'] ['tmp_name'];
$ img_path=upload_path。 '/'。$ file_name;
if(move_uploaded_file($ temp_file,$ img_path)){
$ msg='文件上传成功! ';
$ is_upload=true;
} 别的{
$ msg='文件上传失败! ';
}
首先,端函数在post参数阵列中获取最后一个值,$ file_name=reset($ file)。 '。' 。 $ file [count($ file)-1]。我们可以发布一个名为[0]和[2]的参数,然后$ file [count($ file)-1]为空,$ file_name终于重置($ file),即$ file [0],因此我们可以绕过判断
20210113105239.png-water_print
 
后退
顶部