任意文件上传漏洞
一、介绍
原因是服务器配置不当或者没有进行足够的过滤,用户可以上传任意文件,包括恶意脚本文件、exe程序等,这就造成了文件的上传漏洞。
其中一种引起文件上传漏洞的原因是:变量覆盖(需要代码审计)。
危害:
如果web服务器所保存上传文件的可写目录具有执行权限,那么就可以直接上传后门文件,导致网站沦陷。如果攻击者通过其它漏洞进行提权操作,拿到系统管理权限,那么直接导致服务器沦陷。同服务器下的其他网站无一幸免,均被攻击控制。
通过上传漏洞获得的网站后门,就是webshell。
漏洞利用条件:
1.web服务器要开启文件上传功能,并且上传api(接口)对外开放(web用户可访问);
2.Web用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,web目录都有执行权限。
3.上传文件可执行,web可以解析上传的脚本。
4.无视以上条件的情况就是服务器配置不当,开启了put方法。
二、webshell
shell俗称“壳”,指为“使用者提供操作界面”的软件(命令解释器)。类似于windows的cmd.exe或者Linux下bash等。
Webshell是一个网站的后门,也是命令解释器,以web方式(Http协议)传递命令信息。本质上是在服务器端可运行的脚本文件,后缀名为.php/.asp/.aspx/.jsp等,也就是说webshell接收来自web用户的命令,然后在服务器端执行。
大马:Webshell可以是大马,也是网站木马。代码量比较大。
小马:一句话木马。代码量比较小。
利用中国菜刀与一句话木马配合实现三大功能:
1.文件管理
在中国菜刀页面继承了Web用户权限可以实现文件管理,包括文件查看、上传、下载、修改、删除、甚至运行exe程序等。
2.虚拟终端
在菜刀命令下可以获得类似cmd和bash的命令行接口,可以执行相关命令。
3.数据库管理
需要知道连接数据库的账密。
getshell:就是获取Web的过程和结果。文件上传是Getshell的主要方式之一。
三、中间件解析漏洞
1. Apache的解析原理是根据文件的扩展名从后往前找,遇见不认识的就往前。如文件
info.php.xxx.xx.x 最后解析为info.php
2. IIS6.0解析漏洞
方法一:time.asp;2.jpg 文件是图片文件,但是在浏览器中打开可解析其中的代码,表示当做.asp文件解析。
方法二:先建立一个文件夹1.asp,在文件夹中建立图片文件time.jpg。在浏览器中依然可以顺利解析time.jpg中的代码。也是当成.asp文件解析。
3. PHP CGI解析漏洞
需要IIS7.0/7.5 + php环境,即使用IIS中间件支持php脚本,此步骤不具体解释。
配置好环境好,漏洞复现:在URL打开一个info.png图片文件,该文件无法执行其中的php代码。
但是在路径后面加,php即可执行。此时路径为 localhost:8000/info.png/.php
防御方法很简单,只需修改一个配置。
nginx中也存在上述问题:以上内容本质上与中间件无关,而是与php的一个配置选项有关:在php.ini中cgi.fix_pathinfo默认为1,如果将改为0即可。
4.Nginx空字节漏洞
类似于00截断,在文件路径后面加%00.php
例:localhost/info.html无法解析,但是localhost/info.html%00.php可以把.html文件当做.php解析
5.Nginx文件名逻辑漏洞
本质上也是00截断。用BP抓包,在十六进制里边改00。
四、防御与绕过
1.黑白名单策略。
2.前端限制与绕过。如,在前段用JS脚本做检测,检测文件后缀名等。
3.apache开启put方法上传文件。(具体方法略过)
4.用BP抓包改包(前端绕过)。例如:前端浏览器只允许上传.jpg文件,但目前的webshell是.php,如何绕过?
先将文件改扩展名,由.php改为.jpg,上传并抓包。此时已经绕过浏览器的前端了,离开了浏览器端。在BP包中再将.jpg改为.php,然后放包,此时.php文件成功到达服务器上,并绕过前端过滤。
5.服务器端绕过:
(1)服务器端检查content-type类型:只需要BP抓包,直接修改此类型里的内容即可。
(2)服务器端检测文件内容:函数getimagesize(),检测文件大小。很容易被图片木马绕过。如上传一个图片木马.gif。图片木马上传成功表示该上传漏洞存在。但要让服务器端执行该木马,需要结合其它漏洞,如文件包含漏洞、文件解析漏洞、数据库备份漏洞。服务器端最有效的防御图片木马的方法为二次渲染。
图片包含小马的方法:
(3)文件幻术方法制作图片木马(略过)。
(4)服务器检测文件后缀名。
黑白名单方式。
五、00截断+htaccess
(1)00就是Null(空)字符,URL中为%00,会导致文件上传路径截断。
举例:
原理:php的函数move_uploaded_file函数记录上传文件的原目录与上传目录,改变上传目录的路径,在save_path的原路径后面加(test.php),就把文件夹变为了具体的文件(相当于木马文件),但是这样后面接上传的文件会报错,所以在(test.php)后面加%00截断该路径,文件依然能上传成功,并且能显示info.php。
(2).htaccess 是Apache服务器的分布式配置文件,该配置文件会覆盖Apache服务器的全局配置,作用于是当前目录及其子目录。如果一个Web应用允许上传.htaccess 文件,那就意味着攻击者可以更改Apache的配置,相当危险。(全局配置文件为httpd.conf)
举例:
1)将.png文件当做php文件解析
在.htaccess文件中写入: AddType application/x-httpd-php .png
当访问info.png文件时,info.png文件里的php代码将被执行。
情景:如果一个网站不允许上传.php文件,但是允许修改.htaccess文件。
2)文件名包含php关键字
在.htaccess文件中写入: AddHandler php5-script php
当访问info.php.png文件时,info.php.png文件里的php代码将被执行。
3)匹配文件名
(将文件名当做php文件解析)
例文件名为ajest,在.htaccess文件中写入:
<FilesMatch "ajest">
SetHandler application/x-httpd-php
</FilesMatch>
当访问ajest文件时,ajest文件里的php代码将被执行。
六、常见编辑器上传
编辑器就是网站后台编辑网页的在线编辑器,会自动集成文件上传功能,这些编辑器的某些版本也存在文件上传漏洞。
原文地址:https://www.cnblogs.com/fengyufei/p/15314219.html
- CentOS mysql配置主从复制
- Quartz依赖数据库表
- Spring Security Oauth2.0 实现短信验证码登录
- 【Spring Cloud】Redis缓存接入监控、运维平台CacheCloud
- 基于Redis实现分布式应用限流
- Jasypt : 整合spring boot加密应用配置文件敏感信息
- Eureka:扩展ClientFilter实现服务注册自定义过滤
- 【系统日志】log4j配置学习总结
- 【译】MySQL char、varchar的区别
- 【jfinal修仙系列】修改ShiroPlugin支持jfinal3.0
- MySQL二进制日志
- 【nginx启动】 97 Address family not supported by protocol
- jfinal 内置的handler功能
- JS 对指定iframe 全屏操作
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 什么情况下不能使用最坏情况评估算法的复杂度?
- Python运算符
- kubeadm高可用集群意外删除一mater节点,重新加入失败
- Chevereto——简介及安装
- Typecho开启伪静态并隐藏index.php
- Prism代码高亮Pjax重载函数
- Qt示例-AnalogClock-自定义窗体-使用QPainter的转换和缩放特性简化绘图
- 2019-12-27-traefik
- 2019-12-05-eck-qustion
- 聊聊dubbo-go的ConsumerSignFilter
- Javascript错误处理
- 程序员说模型过拟合的时候,说的是什么?
- 分分钟教会你搭建企业级的 npm 私有仓库
- Golang语言之字符串操作
- Go语言ORM-gorm学习笔记(二)