文件上传漏洞原理:
开发人员未在文件上传点对文件名和文件内容做严格的过滤,导致用户可以上传恶意脚本到服务器
文件上传常用方式
1.当发现网站是iis服务器时,上传 asp或aspx 后缀类型的马
2.当上传asp的脚本文件时上传不上去,可以尝试asa或者cdx或者cer后缀类型的马,iis服务器开启了文件后缀扩展功能
3.上传服务器是apache服务器,试着上传php后缀的马
4.上传服务器中间件是tomcat中间件,上传jsp后缀类型的马
5.上传服务器中间件是weblogic中间件,上传jsp后缀类型的马
6..上传服务器中间件是nginx中间件,上传Php后缀类型的马
1.前端JS验证
(1)上传.png文件,使用bp抓包,修改后缀为.php,直接绕过
(2)F12检查,找到onsubmit,并直接删除它
2.(后端验证)文件类型校验(MIME校验)
上传文件,使用bp抓包,修改Content-Type:的类型
例如:上传.php文件,使用bp抓包
将Content-Type: application/octet-stream
修改为image/png
3.文件后缀名校验,黑名单绕过
修改文件后缀名进行绕过
php可修改为:php3 .php4 .php5 .phtml .phtm .phps .phpt .php345
(注意,上传后文件可能在对方服务器没有相应的配置解析,因此不能被解析)
4.文件后缀名验证 .htaccess攻击(配置文件解析控制).user.ini配置文件
图片马
知识点:exif_imagetype() 函数— 判断一个图像的类型(在头部添加GIF89a,伪造成gif文件进行绕过)
.htaccess是一个配置文件,用于运行Apache网络服务器软件的网络服务器上。
当.htaccess文件被放置在一个 "通过Apache Web服务器加载 "的目录中时,
.htaccess文件会被Apache Web服务器软件检测并执行。
这些.htaccess文件可以用来改变Apache Web服务器软件的配置,
以启用/禁用Apache Web服务器软件所提供的额外功能和特性
过程:上传一个.htaccess文件,接着上传包含一句话木马的4.png文件,进行绕过
.htaccess文件内容为:
<FilesMatch "4.png">
SetHandler application/x-httpd-php
AddType application/x-httpd-php .jpg #将.jpg后缀的文件作为PHP文件解析
</FilesMatch>
.user.ini文件内容为:
GIF89a
auto_prepend_file=4.jpg
5.文件名后缀验证 拼接绕过
使用了deldot()函数,删除文件名末尾的点,但它遇到空格会停下来
通过 . +空格+. 进行绕过
例如:
上传文件1.php,使用bp抓包,修改为1.php. .文件通过deldot()函数变为了1.php,从而进行了绕过
6. 文件名后缀验证,大小写绕过
没有使用了strolower()函数,将后缀都转换成小写,所以通过大小写绕过
例如:
上传1.php文件,使用bp抓包,修改文件名为1.PhP,进行绕过
7.文件名后缀验证,空格绕过
没有使用trim()函数对空格过滤,
window特性对文件名的空格当作空处理,保存时,自动删除空格
例如:
上传一个1.php文件,使用bp抓包,在文件名后缀添加空格进行绕过
8.文件名后缀绕过, 点绕过
没与使用deldot()函数进行过滤文件名后的点
因此可在文件名后加上点进行绕过
例如:
上传一个1.php文件,使用bp抓包,修改文件名为1.php. 进行绕过
9.文件名后缀验证,::$DATA绕过
::$DATA
Windows操作系统处理文件时的特性,为文件流,如果文件名后标记::$DATA,并没有过率,window会不检查,直接保存该文件
例如:
上传一个1.php文件,使用bp抓包,修改文件名为1.php::$DATA进行绕过
10.文件后缀名验证,双写绕过
函数str_ireplace($deny_ext,"", $file_name);将文件名中出现黑名单里面的后缀全部替换为了空
例如:
上传一个1.php文件,使用bp抓包,修改文件名为1.phpphp进行绕过
11.文件后缀名白名单绕过,GET型%00截断
(1) 白名单:$ext_arr = array('jpg','png','gif'); 只允许这三种类型上传
(2)$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
上传文件名,从点的位置通过循环开始截取,而不是一次性截取,对文件名进行验证
(3)if(in_array($file_ext,$ext_arr)){ //判断文件名是否在白名单中,如果在,则进入循环
$temp_file = $_FILES['upload_file']['tmp_name'];//将上传的文件放在临时目录下
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;//使用$_GET['save_path']接受自定义的路径,并且从10~99的数组随机生产一个文件名,再拼接上后缀名
if(move_uploaded_file($temp_file,$img_path)){最终保存在文件中
$is_upload = true;
}
%00截断原理:
利用的是php漏洞,php的基础是C语言实现的,在C语言中认为%00为结束的符号,所以就挤出来C的特性,
在PHP<5.3.4的版本中,在进行存储文件时碰见了move_uploaded_file()函数的时候,
函数读取到hex值为00的字符,认为读取结束,就终止了后面的操作,因此出现00的操作
绕过:
上传一个1.php文件,使用bp抓包,修改文件名为1.png
替换文件中的内容:修改?save_path=./upload/1.php%00
释放包后完成绕过
12.文件名后缀白名单验证,POST型%00截断
与GET型%00原理一样,但需要对%00进行编码
上传一个1.php文件,使用bp抓包,修改文件名为1.png
替换文件中的内容:修改?save_path=./upload/1.php%00
编码操作:
选中%00,右键点击Convert selection——>URL——>URL-decode
查看Hex
释放包完成绕过
13.文件内容检查,文件头验证
$bin = fread($file, 2); //只读2字节
对图片的内容进行了验证,通过检查文件的前2个字节,检查上传文件二进制的头部信息,来进行判断文件的类型
使用图片码的方式绕过:
1.打开cmd,使用命令制作图片码 copy 1/.jpg /b + 1.php /a shell.php
2.直接上传,复制图片链接地址
3.点击“文件包含漏洞地址”,进行传参
14.白名单:只允许上传'zip', 'jpg', 'gif', 'png'
上传压缩包文件zip
创建0123456789012345文件,压缩为zip文件,使用010打开,
修改0123456789012345为/../../1.php.xxx,保存,上传zip文件,访问1.php.xxx
https://www.cnblogs.com/murkuo/p/14915458.html
15.文件内容检查,图片二次渲染
使用了imagecreatefrom系列的函数,上传的图片去生产一张新的图片,生成的结果会返回一个变量
上传后把图片在新建的时候把其中的代码筛选出来,并且去除。最后只保留图片信息,在进行排序重建。
第一步:打开cmd,使用gif图片和代码的文件使用命令合办一张图片 copy 1.gif /b + 1.php /a blank.gif
第二步:上传服务器
第三步:将第一步合并的图片使用010 Editor工具打开
第四步:将上传服务器的图片,在upload目录下寻找,也使用010 Editor工具打开
第五步:将两个文件进行比较Tool——>Compare Files——>Compare,比较蓝色部分没有被排列重组的地方,在第二次渲染后的图片中加入一句话木马
第六步:把刚刚保存好的图片从upload目录下,剪切到你要上传文件的目录
第七步:将图片重新上传到服务器上
第八步:点击文件包含漏洞URL,传参