上传漏洞
文件上传是Web系统提供的文件上传入口,头像更换、exls上传、其他类型文件上传等(更多文字描述可参考网络详细描述.)
攻击者一旦找到上传入口,可能导致系统被植入恶意程序及系统权限被盗取等风险。
检测类型
环境
准备
Centos 7 armv7l、Windows 7
Apache
phpstudy pro
PHP Version 5.4.16、PHP Version 5.2.17
搭建
搭建部分省略参考网络.部分实战均参考网上姿势,并未按照每关实战。
以下一定区分目标系统及对应PHP所属版本,否则将无法复现对应漏洞。
实操
JavaScript
原理
针对客户端的安全检测,存在安全隐患,攻击者一旦对用户提交及客户端其他信息可控时,导致可能上传一些恶意程序。
绕过
- 图片上传、修改文件后缀
- 禁用相关检测JavaScript:Chrome 内核的浏览器在审查元素的状态下可以找到 Settings 选项,然后找到 「Debugger」 选项下面直接勾选 「Disable JavaScript」即可。
实战
1、上传php文件
1 | php文件上传报错!提醒只能传图片 |
2、截获并修改后缀上传
1 | 如下图:php文件上传成功 |
禁用JS之后进行文件上传
可解析后缀
原理
后台设置黑名单,不允许上传指定后缀文件,如:asp
、aspx
、php
、jsp
等后缀。
绕过
需结合apache配置文件中http.conf
添加多种后缀来实现对上传文件的绕过
1 | AddType application/x-httpd-php .php .phtml .phps .php5 .pht .php2 .php3 |
实战
1、上传php文件
1 | 提示后缀文件不满足系统要求 |
2、修改后缀
1 | 修改后缀为:php2 |
3、URL直接方式
1 | # 观察URL |
.htaccess
原理
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
绕过
Apache配置文件httpd.conf中AllowOverride
的None修改为All
即可绕过;
注意:针对目录一定要在项目所在目录;配置完成后httpd重启即可。
实战
1、本地新建.htaccess文件内容如下
1 | # 让Apache将其他类型文件均以php格式解析 |
2、然后上传图片马
1 | # 图片马内容如下 |
3、URL访问
1 | http://192.168.3.32/upload-labs/upload/test.jpg |
后缀大小写
原理
确保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
实战
1、修改文件后缀
2、文件上传
3、URL访问
1 | http://192.168.3.32/upload-labs/upload/test.phP |
点后缀
原理
利用Windows系统的文件名特性。文件名最后增加点,写成si1ent.php.
,上传后保存在Windows系统上的文件名最后的一个.
会被去掉,实际上保存的文件名就是si1ent.php
绕过
文件名尾部添加.
尝试绕过。
实战
1、尝试上传php文件
2、修改请求头信息并添加.
3、URL
1 | http://192.168.5.138/upload/si1ent.php |
空格
原理
利用Windows系统的文件名特性。文件名最后增加空格,文件上传后,系统会自动删除文件后缀的空格。
绕过
文件后缀添加空格绕过
实战
1、php文件上传
2、添加空格
3、URL访问
1 | http://192.168.5.138/upload/202101221428511486.php |
::$DATA
原理
Windows文件流特性绕过,文件名改成08.php::$DATA,上传成功后保存的文件名其实是08.php
绕过
文件后缀添加::$DATA
实战
1、php文件上传
2、修改后缀
::$DATA
3、URL访问
1 | http://192.168.5.138/upload/202101221419595445.php |
MIME绕过
原理
服务器端针对用户上传文件HTTP请求头中Content-Type: image/jpeg
是否为图片类型,否则文件无法上传。
绕过
修改Content-Type: image/jpeg
并修改文件后缀为php
,重新发送数据包即可绕过。
实战
1、修改文件后缀为jpg
2、修改文件后缀
3、URL访问
1 | http://192.168.3.32/upload-labs/upload/test.php |
双后缀
原理
此类主要以黑名单形式来过滤并替换敏感后缀名。
绕过
修改双后缀名尝试绕过。
实战
1、上传修改后缀名
2、URL访问
1 | http://192.168.3.32/upload-labs/upload/test.php |
%00截断
原理
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。
1 | http://192.168.5.138/Pass-12/index.php?save_path=../upload/test2.jpg 此时输出的是test2.jpg |
条件:
1、PHP版本小于5.3.4
2、magic_quotes_gpc设置Off
绕过
在请求头中添加对应%00尝试截断绕过,添加位置需结合实际情况添加。
实战
1、上传jpg马
2、添加%00后缀实现截断
1 | # 上传后文件路径信息如下 |
3、URL访问
1 | http://192.168.5.138/upload/test2.php |
0x00截断
原理
和%00相似,0x00是16进制下0,在ASCII码里代表NULL;同样表示结束符。
绕过
修改文件上传路径及修改0x00后再尝试上传。
实战
1、尝试图片上传
2、在路径中添加新的文件名及后缀
3、16进制下修改2b为00
1 | 2b=>+ |
5、URL访问
1 | http://192.168.5.138/upload/si1ent.php |
文件头部
原理
主要检测上传文件头是否满足图片,如果满足则允许上传。
绕过
POST数据包中提交GIF89a,或者其他图片类型的文件头即可绕过。
图片无法直接,需要利用文件包含漏洞来加载存在恶意代码的图片
实战
1、直接php文件上传
2、在文件内容中添加图片头部
1 | GIF89a |
3、使用包含代码读取gif文件
1 | http://192.168.5.138/upload/include.php?file=2120210122135419.gif |
getimagesize
原理
利用php中函数getimagesize检测文件头信息是否是图片类型。
绕过
修改文件头部,或制作图片马来尝试绕过,需集合文件包含漏洞加载图片,gif、jpg类型图片马无法解析。
实战
1、php文件上传报错
2、修改文件头部
3、URL访问
1 | http://192.168.5.138/upload/include.php?file=6620210122143835.gif |
exif_imagetype
原理
这里使用Pass-16,源码中提醒打开对应扩展模块php_exif
,这里如果开启后上传php文件还是黑屏尝试开启php_mbstring
扩展。
exif_imagetype
函数读取一个图像的第一个字节并检查其签名。如果发现了恰当的签名则返回一个对应的常量
绕过
文件头部添加GIF89a或其他图片头或制作图片马;
需结合文件包含漏洞
实战
1、php上传
2、修改文件头
3、URL访问
1 | http://192.168.5.138/upload/include.php?file=6620210122151725.gif |
条件竞争
未复现成功。
Referer
1 | http://www.owasp.org.cn/OWASP_Training/Upload_Attack_Framework.pdf |
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章