1. 概念
客户端 选择发送的文件->服务器接收->网站程序判断->临时文件->移动到指定的路径
服务器 接收的资源程序
客户端前端表单上传代码案例:
<html> <head></head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <label for="file">Filename:</label> <input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html>
服务端接受并根据返回码进行判断的后端php代码案例:
<?php if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } ?>
2. 文件上传时的错误代码
值:0 表明没有错误发生,文件上传成功。
值:1 表明上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
值:2 表明上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
值:3 表明文件只有部分被上传。
值:4 表明没有文件被上传。
3. 绕过黑名单过滤:
asp asa cdx cer php aspx ashx jsp php3 php.a shtml phtml
或者双写后缀,大小写转换
4. 漏洞类型(涉及到uploadlab):
a. 使用JavaScript拦截(客户端js验证)(pass1):
方法一: 关闭firefox工具栏上的js功能就行。
方法二: 把网站的前端代码复制下来,更改前端代码,使其不使用js脚本
具体来说就是在<form>标签中添加action属性,导向目标url,然后更改静态提交按钮的属性,删掉onclick属性,不让他调用js脚本
方法三: 上传图片马,在burpsuite中更改后缀
b. 黑名单过滤(pass3、pass5、pass6、pass7)
方法: 其他的后缀名、大小写转换、加"."或者"空格"在后缀(win)
c. 白名单过滤
方法: 其他的后缀名
ps: 这两者可以用burpsuite先fuzz一下,看看过滤类型和内容
d. 验证MIME/Content-type(pass2)
方法: 抓包,修改content-type的内容为image/jpeg或者image/png或者image/gif
e. 文件头检测绕过(pass13)
通过检测上传的文件头来判断是否为图片
常见的文件头:
方法: 给木马添加文件头或者上传图片马(后缀非图片文件后缀),图片马的合成指令为: copy 图片路径/b + 木马路径 新的木马或者图片马路径
f. iis6.0解析漏洞(pass11、12)
当上传过滤为白名单而且服务器为iis6.0时使用该漏洞
漏洞原理:
(1)、以xxx.asp或者xxx.cer命名的文件夹里的文件都将会被当成ASP文件执行,属于目录解析漏洞
(2)、xxx.php;.jpg,在;后面的不被解析,相当于截断,属于文件解析漏洞,访问时记得带上;和其后面的后缀(前提是没改文件名)。.jpg的作用在于绕过名单
漏洞利用:
(1)、当上传文件的路径可改时(比如burpsuite中Params内更改上传路径属性的值),创建x.asp文件夹,把图片马传上去
(2)、传图片马,记得带上截断
g. %00截断(pass11)
原理:
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
post不会像get对%00进行自动解码
使用所需条件:
php版本要小于5.3.4,5.3.4及以上已经修复该问题
magic_quotes_gpc需要为OFF状态
这两者缺一不可
应用场景:
直接截断文件名
创建目录可控 %00截断创建目录 利用iis6.0解析漏洞 上传文件到这个目录里面
截断参数 生成文件,即上传后文件被改名(增加前缀),此时更改前缀参数并截断后面内容
使用方法:
方法一: 在burpsuite的Hex中找到对应的地方,改成00
方法二: 输入%00后url解码一下
h. 重写漏洞(pass4)
条件: apache开启重写模块,LoadModule rewrite_module modules/mod_rewrite.so
使用方法:
apache:上传.htaccess文件,内容为:
<FileMatch "xxx"> SetHandler application/x-httpd-php </FileMatch>
#define width 1337 #define height 1337 \x00\x00\x8a\x39\x8a\x39 auto_prepend_file = 1.jpg
i. 系统特性突破(绕过防火墙)
漏洞原理: 利用PHP 和 Windows环境的叠加特性,上传x.php:.jpg时,会生成x.php的空白文件,接着,以下符号在正则匹配时的相等性:
双引号" 相当于 点号.
大于符号> 相当于 问号?
小于符号< 相当于 星号*
文件名.<或文件名.<<<或文件名.>>>或文件名.>><空文件名
写入filename.<<<
j. NTFS交换数据流(绕过防火墙)(pass8)
漏洞原理:
NTFS文件系统中对备用数据流(文件流)和对支持windows系统中默认采用这种数据流::$DATA(只有win支持),如果文件名后加::$DATA会把上传的数据当作文件流去处理,不会检测后缀名,且保持::$DATA之前的文件名目的就是绕过对后缀名的检测,源代码缺少对::$DATA的过滤,抓包在后缀后面加上::$DATA即可,访问时要去除后面的::$DATA,直接访问php文件就行
k. 双文件上传漏洞
漏洞原理:
往往对第一个文件上传进行检测而忽略第二个, 所以在第二个地方上传shell就行
l. iis7.0|iis7.5|nginx解析漏洞
漏洞原理:
1. php.ini里cgi.fix_pathinfo=1(默认为1)
2. 在”Handler Mapping”中取消勾选"仅当请求映射至以下内容时才调用处理程序"
漏洞利用: xxx.jpg/.php表示将图片当成php解析
m. nginx < 0.83 漏洞
漏洞原理: %00截断
漏洞利用: /1.jpg%00php
n. 图片二次渲染(pass16)
漏洞原理: 服务器会根据用户上传的图片重新生成图片,但其十六进制文件有部分没有改变
漏洞利用: 上传图片,把图片下载下来进行十六进制内容对比,找出没有修改的地方,替换成木马代码.
<待补充>