si1ent

Upload File

2021-01-22

上传漏洞

文件上传是Web系统提供的文件上传入口,头像更换、exls上传、其他类型文件上传等(更多文字描述可参考网络详细描述.)

攻击者一旦找到上传入口,可能导致系统被植入恶意程序及系统权限被盗取等风险。

检测类型

upload-labs

环境

准备

Centos 7 armv7l、Windows 7

Apache

phpstudy pro

PHP Version 5.4.16、PHP Version 5.2.17

upload-labs

image-20210119172948063

搭建

搭建部分省略参考网络.部分实战均参考网上姿势,并未按照每关实战。

以下一定区分目标系统及对应PHP所属版本,否则将无法复现对应漏洞。

实操

JavaScript
原理

针对客户端的安全检测,存在安全隐患,攻击者一旦对用户提交及客户端其他信息可控时,导致可能上传一些恶意程序。

绕过
  • 图片上传、修改文件后缀
  • 禁用相关检测JavaScript:Chrome 内核的浏览器在审查元素的状态下可以找到 Settings 选项,然后找到 「Debugger」 选项下面直接勾选 「Disable JavaScript」即可。
实战

1、上传php文件

1
php文件上传报错!提醒只能传图片

image-20210119202825058

2、截获并修改后缀上传

1
如下图:php文件上传成功

image-20210119203305321

禁用JS之后进行文件上传

image-20210122140414231

可解析后缀
原理

后台设置黑名单,不允许上传指定后缀文件,如:aspaspxphpjsp等后缀。

绕过

需结合apache配置文件中http.conf添加多种后缀来实现对上传文件的绕过

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

image-20210119210506106

实战

1、上传php文件

1
提示后缀文件不满足系统要求

image-20210119204757406

2、修改后缀

1
修改后缀为:php2

image-20210119205013968

3、URL直接方式

1
2
# 观察URL
http://192.168.3.32/upload-labs/upload/202101192103033733.php2

image-20210119210544026

.htaccess
原理

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

绕过

Apache配置文件httpd.conf中AllowOverride的None修改为All即可绕过;

注意:针对目录一定要在项目所在目录;配置完成后httpd重启即可。

image-20210121103141134

实战

1、本地新建.htaccess文件内容如下

1
2
# 让Apache将其他类型文件均以php格式解析
SetHandler application/x-httpd-php

image-20210121102634932

2、然后上传图片马

1
2
3
4
# 图片马内容如下
<?php
phpinfo();
?>

image-20210121102748916

3、URL访问

1
http://192.168.3.32/upload-labs/upload/test.jpg

image-20210121103343955

后缀大小写
原理

确保apache的配置文件中httpd.conf修改可解析指定类型或所有类型文件。

源码中过滤所有可能后缀文件,但未针对大写文件过滤。

1
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess");
绕过

1、确保 AllowOverride All

修改文件后缀为大写:phP

image-20210121141028025

实战

1、修改文件后缀

image-20210121141032227

2、文件上传

image-20210121141218900

3、URL访问

1
http://192.168.3.32/upload-labs/upload/test.phP

image-20210121141243455

点后缀
原理​

利用Windows系统的文件名特性。文件名最后增加,写成si1ent.php.,上传后保存在Windows系统上的文件名最后的一个.会被去掉,实际上保存的文件名就是si1ent.php

绕过

文件名尾部添加.尝试绕过。

实战

1、尝试上传php文件

image-20210122141303212

2、修改请求头信息并添加.

image-20210122141342964

3、URL

1
http://192.168.5.138/upload/si1ent.php

image-20210122141446478

空格
原理

利用Windows系统的文件名特性。文件名最后增加空格,文件上传后,系统会自动删除文件后缀的空格。

绕过

文件后缀添加空格绕过

实战

1、php文件上传

image-20210122143154683

2、添加空格

image-20210122142921289

3、URL访问

1
http://192.168.5.138/upload/202101221428511486.php

image-20210122143024564

::$DATA
原理

Windows文件流特性绕过,文件名改成08.php::$DATA,上传成功后保存的文件名其实是08.php

绕过

文件后缀添加::$DATA

实战

1、php文件上传

image-20210122142328718

2、修改后缀

::$DATA

image-20210122142253013

3、URL访问

1
http://192.168.5.138/upload/202101221419595445.php

image-20210122142358270

MIME绕过
原理

服务器端针对用户上传文件HTTP请求头中Content-Type: image/jpeg是否为图片类型,否则文件无法上传。

绕过

修改Content-Type: image/jpeg并修改文件后缀为php,重新发送数据包即可绕过。

实战

1、修改文件后缀为jpg

image-20210121155042175

2、修改文件后缀

image-20210121155016541

3、URL访问

1
http://192.168.3.32/upload-labs/upload/test.php

image-20210121155205663

双后缀
原理

此类主要以黑名单形式来过滤并替换敏感后缀名。

绕过

修改双后缀名尝试绕过。

实战

1、上传修改后缀名

2、URL访问

1
http://192.168.3.32/upload-labs/upload/test.php

image-20210121163621877

%00截断
原理

在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。

1
2
3
http://192.168.5.138/Pass-12/index.php?save_path=../upload/test2.jpg           此时输出的是test2.jpg
加上%00
http://192.168.5.138/Pass-12/index.php?save_path=../upload/test2.php%00                   此时输出的是test2.php

条件:

1、PHP版本小于5.3.4

2、magic_quotes_gpc设置Off

绕过

在请求头中添加对应%00尝试截断绕过,添加位置需结合实际情况添加。

实战

1、上传jpg马

image-20210122104458582

2、添加%00后缀实现截断

1
2
# 上传后文件路径信息如下
../upload/test3.php/5620210122104612.jpg

image-20210122095025999

3、URL访问

1
http://192.168.5.138/upload/test2.php

image-20210122095105187

0x00截断
原理

和%00相似,0x00是16进制下0,在ASCII码里代表NULL;同样表示结束符。

绕过

修改文件上传路径及修改0x00后再尝试上传。

实战

1、尝试图片上传

image-20210122105925351

2、在路径中添加新的文件名及后缀

image-20210122110103621

3、16进制下修改2b为00

1
2
2b=>+
00=>0

image-20210122110232407

5、URL访问

1
http://192.168.5.138/upload/si1ent.php

image-20210122110602714

文件头部
原理

主要检测上传文件头是否满足图片,如果满足则允许上传。

绕过

POST数据包中提交GIF89a,或者其他图片类型的文件头即可绕过。

图片无法直接,需要利用文件包含漏洞来加载存在恶意代码的图片

实战

1、直接php文件上传

image-20210122135346384

2、在文件内容中添加图片头部

1
GIF89a

image-20210122135434987

3、使用包含代码读取gif文件

1
http://192.168.5.138/upload/include.php?file=2120210122135419.gif

image-20210122135607630

getimagesize
原理

利用php中函数getimagesize检测文件头信息是否是图片类型。

绕过

修改文件头部,或制作图片马来尝试绕过,需集合文件包含漏洞加载图片,gif、jpg类型图片马无法解析。

实战

1、php文件上传报错

image-20210122144032418

2、修改文件头部

image-20210122144007909

3、URL访问

1
http://192.168.5.138/upload/include.php?file=6620210122143835.gif

image-20210122143944767

exif_imagetype
原理

这里使用Pass-16,源码中提醒打开对应扩展模块php_exif,这里如果开启后上传php文件还是黑屏尝试开启php_mbstring扩展。

exif_imagetype函数读取一个图像的第一个字节检查其签名。如果发现了恰当的签名则返回一个对应的常量

绕过

文件头部添加GIF89a或其他图片头或制作图片马;

需结合文件包含漏洞

实战

1、php上传

image-20210122151705666

2、修改文件头

image-20210122151741761

3、URL访问

1
http://192.168.5.138/upload/include.php?file=6620210122151725.gif

image-20210122151816134

条件竞争

未复现成功。

Referer

1
2
3
http://www.owasp.org.cn/OWASP_Training/Upload_Attack_Framework.pdf
https://github.com/c0ny1/upload-labs
其他参考互联网
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章