文件上传漏洞
对文件上传类型进行区分,是属于编辑器文件上传,还是属于第三方应用,还是会员中心。要确保文件上传是什么类型,就用什么类型方法对它进行后期的测试。

常规类:扫描获取上传,会员中心上传,后台系统上传,各种途径上传
CMS类:已知CMS源码,搜索已知cms漏洞
编辑器类:ckeditor,fckeditor,kindeditor,xxxeditor,也是搜索相关编辑器漏洞
配合解析漏洞下的文件类型后门:可以通过解析漏洞,上传包含后门代码的图片
上传方法
方法一
先直接传一个PHP,实战先传马。
实战先传一个正常的图片,看看有无返回存储地址。
如果能直接上传并解析,已离成功不远。
方法二
先传一个shell,然后进行修改。
connect-Type:image/jpeg,看看是否可以进行绕过,如果不行,在上传内容添加GIF89a
当然上传了还得看是否能够被解析为php,所有的上传都要考虑是否能够被解析。
方法三
上传一个abc.abcd,目的只是为了查看是否为白名单还是黑名单绕过。
黑名单限制一般为此文件类型不允许上传,考虑双写,大小写,空格,php2,php3,php4,php5,pht
phtml,等方式
我们继续上传一个/htaccess文件
.htaccess文件能够设置服务器的解析文件的格式,匹配到dudu就已php的格式来解析,继而上传马
如果说.htaccess不能上传,接下来上传一个.user.ini,继而上传一个马
方法四
如果白名单限制上传
考虑00截断上传
文件包含漏洞+图片马
文件包含漏洞+二次渲染+图片马
方法五
上传的东西是否被服务器很快的删除或者移除,或者说上传成功,但是无法访问,就得考虑条件竞争。
以上均不行,考虑逻辑层面的思路。
涉及资源
https://github.com/c0ny1/upload-labs
后端黑白名单绕过

文件上传常见验证
后缀名(直接),类型(间接),文件头等
后缀名
黑名单,白名单
黑名单:
明确不允许上传的格式后缀
asp php jsp aspx cgi war 等
如果php phtml..没有定义到后名单里,可以用这格式绕过限制,依旧可以达到效果
白名单
明确可以上传的格式后缀
jpg png zip rar gif 等
要白名单验证要更安全
文件类型:MIME 信息
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,
当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式
Content-Type称之为MIME信息
靶场练习
upload-lab-01
由于采用了前端验证,所以可以通过抓包直接修改文件格式,从而绕过。

upload-lab-02
拦截上传shell.php的请求包,修改文件类型为:image/jpeg或者image/png或者image/gif


upload-lab-03
采用了黑名单的过滤方式
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH. '/' . $_FILES['upload_file']['name'])) {
$img_path = UPLOAD_PATH .'/'. $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
php,phps,php3,php5,pht等都有可能被解析成php文件的,当然这得取决apache的配置。先试试看,通过Burpsuite改包上传成功。

upload-lab-04
利用 .htaccess 文件进行绕过
其内容为 AddType application/x-httpd-php .jpg
可以将jpg格式的文件作为php文件进行解析
先上传 .htaccess 文件再上传 hacker.jpg 文件

upload-lab-05
大小写绕过,window上搭载的服务器是不区分大小写的,而Linux上的服务器是区分的,所以win上搭载的服务器可以通过大小写绕过防护。

upload-lab-06
还是黑名单限制,通过查看源代码,知道删除了文件名后面的., 但是并没有删除空格,所以通过上传一个后缀名再添加一个空格的文件去绕过黑名单,windoes在创建文件时会自动删掉最后的空格。
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = $_FILES['upload_file']['name'];
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
if (!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH . '/' . $_FILES['upload_file']['name'])) {
$img_path = UPLOAD_PATH . '/' . $file_name;
$is_upload = true;
}
} else {
$msg = '此文件不允许上传';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}

upload-lab-07
在第七行发现,原来是没有过滤末尾的点呀,吸取上一次的教训,直接修改后缀名在后面加.是不可以的,因为会被win自动过滤
所以还是使用抓包修改
1
$is_upload = false;
$msg = null;
if (isset($_POST[‘submit’])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(“.php”,”.php5”,”.php4”,”.php3”,”.php2”,”.html”,”.htm”,”.phtml”,”.pht”,”.pHp”,”.pHp5”,”.pHp4”,”.pHp3”,”.pHp2”,”.Html”,”.Htm”,”.pHtml”,”.jsp”,”.jspa”,”.jspx”,”.jsw”,”.jsv”,”.jspf”,”.jtml”,”.jSp”,”.jSpx”,”.jSpa”,”.jSw”,”.jSv”,”.jSpf”,”.jHtml”,”.asp”,”.aspx”,”.asa”,”.asax”,”.ascx”,”.ashx”,”.asmx”,”.cer”,”.aSp”,”.aSpx”,”.aSa”,”.aSax”,”.aScx”,”.aShx”,”.aSmx”,”.cEr”,”.sWf”,”.swf”,”.htaccess”);
$file_name = trim($_FILES[‘upload_file’][‘name’]);
$file_ext = strrchr($file_name, ‘.’);
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace(‘::$DATA’, ‘’, $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件类型不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
2
$is_upload = false;
$msg = null;
if (isset($_POST[‘submit’])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(“.php”,”.php5”,”.php4”,”.php3”,”.php2”,”php1”,”.html”,”.htm”,”.phtml”,”.pht”,”.pHp”,”.pHp5”,”.pHp4”,”.pHp3”,”.pHp2”,”pHp1”,”.Html”,”.Htm”,”.pHtml”,”.jsp”,”.jspa”,”.jspx”,”.jsw”,”.jsv”,”.jspf”,”.jtml”,”.jSp”,”.jSpx”,”.jSpa”,”.jSw”,”.jSv”,”.jSpf”,”.jHtml”,”.asp”,”.aspx”,”.asa”,”.asax”,”.ascx”,”.ashx”,”.asmx”,”.cer”,”.aSp”,”.aSpx”,”.aSa”,”.aSax”,”.aScx”,”.aShx”,”.aSmx”,”.cEr”,”.sWf”,”.swf”);
$file_name = trim($_FILES[‘upload_file’][‘name’]);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, ‘.’);
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace(‘::$DATA’, ‘’, $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
upload-lab-08
和7一样的
$file_name = deldot($file_name);//删除文件名末尾的点
少了这个过滤,
所以我们可以进行文件名加点绕过。
Windows有个特性,就是如果文件名后缀以.或者空格结尾的,系统在保存文件时会自动去除点和空格。所以可以通过在文件名后面增加一个点来绕过限制
upload-lab-09
源码截取
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(“.php”,”.php5”,”.php4”,”.php3”,”.php2”,”.html”,”.htm”,”.phtml”,”.pht”,”.pHp”,”.pHp5”,”.pHp4”,”.pHp3”,”.pHp2”,”.Html”,”.Htm”,”.pHtml”,”.jsp”,”.jspa”,”.jspx”,”.jsw”,”.jsv”,”.jspf”,”.jtml”,”.jSp”,”.jSpx”,”.jSpa”,”.jSw”,”.jSv”,”.jSpf”,”.jHtml”,”.asp”,”.aspx”,”.asa”,”.asax”,”.ascx”,”.ashx”,”.asmx”,”.cer”,”.aSp”,”.aSpx”,”.aSa”,”.aSax”,”.aScx”,”.aShx”,”.aSmx”,”.cEr”,”.sWf”,”.swf”,”.htaccess”);
$file_name = trim($_FILES[‘upload_file’][‘name’]);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, ‘.’);
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace(‘::$DATA’, ‘’, $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
比起上面的,都进行了过滤和限制,但是存在逻辑漏洞
当我们构造一个 phpinfo.php. .的文件时
phpinfo.php. . –删除文件名末尾的点–>phpinfo.php.
phpinfo.php. ——转换为小写———->phpinfo.php.
phpinfo.php. —去除字符串::$DATA–>phpinfo.php.
phpinfo.php. ——-首尾去空————>phpinfo.php.
phpinfo.php. –后缀没有在黑名单中—>成功上传—–>解析时默认删除末尾的 . —>最终等价于上传了phpinfo.php文件

upload-lab-10
上传 10.pphphp 文件
后端黑名单中包含 ‘php’ , 会将php替换为空 , 但只替换一次 , 替换后的文件名为 10.php , 仍然可以正常使用

upload-lab-11
%00截断
.pphphp
都不对,气死了
upload-lab-12
利用%00url截断绕过

upload-lab-13
也是利用%00url截断绕过,但是环境问题无法验证,需要低版本的php
upload-lab-14
制作图片木马https://blog.csdn.net/qq_42702981/article/details/118652121
存在文件包含漏洞
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
?>
判断了是否为图片
function isImage($filename){
$types = '.jpeg|.png|.gif';
if(file_exists($filename)){
$info = getimagesize($filename);
$ext = image_type_to_extension($info[2]);
if(stripos($types,$ext)){
return $ext;
}else{
return false;
}
}else{
return false;
}
}
上传带有木马的jpg文件,通过文件包含漏洞执行
upload-lab-15
与14相同
upload-lab-16
https://blog.csdn.net/u014029795/article/details/102908114
存在二次渲染,需要手动寻找未被修改的位置,写入payload.
https://blog.csdn.net/u014029795/article/details/102908114
upload-lab-17
条件竞争
通过不断发包从而达到效果,可以通过burp进行爆破
https://www.fujieace.com/penetration-test/upload-labs-pass-17.html
upload-lab-18
和17 相同




