文件上传
原理
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件
文件包含原理
将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校检或者校检被绕过就造成了文件包含漏洞。
常用防御方式
1.检查文件上传路径 ( 避免 0x00 截断、 IIS6.0 文件夹解析漏洞、目录遍历 )
2.文件扩展名检测 ( 避免服务器以非图片的文件格式解析文件 ),验证文件扩展名 通常有两种方式 : 黑名单和白名单 .
3.文件 MIME验证 ( 比如 GIF 图片 MIME为 image/gif,CSS 文件的 MIME为 text/css 等 )
4.图片二次渲染 ( 最变态的上传漏洞防御方式 , 基本上完全避免了文件上传漏洞 )
5.文件重命名 ( 如随机字符串或时间戳等方式 , 防止攻击者得到 webshell 的路径 )
6.隐藏上传路径
7.文件内容检测 ( 避免图片中插入 webshell)
绕过方式
前端js检测
禁用js
MIME检测
修改文件的Content-Type
白名单检测
使用%00截断.php%00.jpg,或者将php后添加一个00的十六进制
黑名单绕过
php可改为php2,php3,php4,phtml
.htaccess文件绕过
添加一个配置文件,将指定的文件解析为php
1 | AddType applocation/x-httpd-php .png(这里是你指定的文件) |
.user.ini.绕过
.user.ini
文件里的意思是:所有的php文件都自动包含指定的文件
1 | auto_prepend_file=test.jpg |
前提是上传目录下有可执行的php文件
apache解析漏洞
Apache按从右到左的顺序识别文件后缀,直至找到后缀能匹配配置文件中的设置。遇到不能识别的后缀名便跳过。
shell.php.xxx将会被解析成php文件,可用来绕过黑名单过滤
Nginx解析漏洞
在Nginx的服务器环境下,假如成功上传一张名为test.jpg的文件到网站,如果我们访问/test.jpg/test.php
这个虚构的目录时服务器会直接将test.jpg作为php文件进行解析。
windows文件命名规则的特殊利用
shell.php. ———-文件名后加点‘.’
shell.php ———-文件名后加括号空格
shell.php::$DATA ———-文件名后加::$DATA
文件头检测
制作图片马
1 | copy 1.gif/b +shell.php/a test.gif |
或者在文件头部添加文件幻数
禁止<?
1 | <script language="php">eval($_POST['123']);</script> |
条件竞争
一些网站上传文件的逻辑是先允许上传任意文件, 然后检查上传的文件是否包含WebShell脚本,如果包含则删除该文件。这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作),攻击者就可以利用这个时间差完成竞争条件的上传漏洞攻击
zip伪协议文件上传
将马打包成zip,然后重命名为jpg上传,再使用zip伪协议读取该路径,在路径后面添加#以及马的名字