web安全过滤绕过攻击过程,MIME方式的过滤

web安全

文件名过滤绕过攻击过程,上传文件的页面为file_upload.html,点击上传的提交按钮开始上传;上传的文件被file_handle.php接收到,在该文件中,具有以MIME方式的过滤,仅允许上传jpg、gif、bmp类型的文件,通过验证的文件存储到当前目录中的upload文件夹中;编写一个名为server_info.php的攻击文件,现利用上传页面上传该文件,并且能够通过file_handle.php文件的验证,存储到指定的文件夹中;最后,打开该攻击文件,查看服务器的信息。

目录

一、file_upload.html文件

1、简介

​ 这个文件的作用是①利用表单控件实现页面的上传文件功能②利用JavaScript语句完成前端对文件类型的过滤,使上传文件类型只能为,jpg、gif、bmp类型。

2、文件主要代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		
	</head>
	<body class="beijing">
		<form action="file_handle.php" method="post" enctype="multipart/form-data" name="uploadfile" onsubmit="return checkFile()">
			<label for="file">请选择上传的文件:</label>
			<input type="file" name="upfile" id="file"/>
			<br/>
			<input type="submit" name="submit" value="上传"/>
		</form>
	</body>
</html>

<script type="text/javascript">
	function checkFile() {
		var file = document.getElementsByName('upfile')[0].value;
		if (file == null || file == "") {
			alert("请选择要上传的文件!");
			return false;
		}
		var allow_ext = ".jpg|.gif|.bmp";
		var ext_name = file.substring(file.lastIndexOf("."));
		if (allow_ext.indexOf(ext_name) == -1) {
			var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
			alert(errMsg);
			return false;
		}
	}
</script>

二、file_handle.php文件

1、简介

​ 这个文件的主要作用是运用MIME过滤方法对文件对应的Content-Type类型进行过滤及将上传文件保存到uoload目录下,此文件中设置只允许image/jpeg、image/gif、image/bmp三种类型可以通过,即对应表示jpg、gif、bmp类型的图片文件。在文件上传阶段分为了3中情况:一是MIME过滤时验证不通过,则返回提示文件不合法的信息。二是MIME过滤验证通过后,检查upload目录下文件已经存在,则返回提示文件已经存在的信息。三是MIME过滤验证通过后,检查upload目录下文件不存在,则对上传的临时文件保存到upload目录下,并且返回上传文件的信息及上传成功的提示。

2、文件代码
<?php  
if(isset($_POST['submit'])){
	$okType=false;
	
	$name=$_FILES['upfile']['name'];
	$type=$_FILES['upfile']['type'];
	$tmp=$_FILES['upfile']['tmp_name'];
	$size=$_FILES['upfile']['size'];
	
	$extension=substr(strrchr($name,"."),1);
	if(!exif_imagetype($tmp)){
		echo "============文件头不是图片============"."<br/>";
		echo "文件类型不合法!!!<br/>请上传.jpg | .gif | .bmp类型的文件。<br/>当前文件类型为:.".$extension."。";
	}else{
		echo "============文件头验证通过============"."<br/>";
		
		switch ($type){
			case 'image/jpeg':$okType=true;
			echo "============文件类型验证通过============"."<br/>";
			break;
			case 'image/gif':$okType=true;
			echo "============文件类型验证通过============"."<br/>";
			break;
			case 'image/bmp':$okType=true;
			echo "============文件类型验证通过============"."<br/>";
			break;
			default:
			echo "============文件类型验证不通过============"."<br/>";
				die("文件类型不合法!!!<br/>请上传.jpg | .gif | .bmp类型的文件。<br/>当前文件类型为:.".$extension."。");
				break;
		}
		
		if ($_FILES['upfile']['error']==0 && $okType){
			if(file_exists("upload/".$name)){
				echo $name."文件已经存在。";
			}else{
				if (!is_dir("./upload")){
					mkdir("./upload");
				}else{
					$path="./upload/".$name;
					move_uploaded_file($tmp,$path);
					echo "============文件信息Top============"."<br/>";
					echo "文件名称:".$name."<br/>";
					echo "文件类型:".$type."<br/>";
					echo "文件大小:".($size/1024)."Kb<br/>";
					echo "临时存储路径:".$tmp."<br/>";
					echo "文件已经被存储到:"."./upload/".$name."<br/>";
					echo "============文件信息End============"."<br/>";
					echo "文件上传成功!";
					echo "文件保存路径:".$path."<br/>";
					echo "上传成功!!!<br/>";
				}
			}
		}}
}

?>

三、server_info.php文件

1、简介

​ 这个文件是上传的攻击文件,其主要作用是显示服务器的信息及php的信息。

2、server_info.php的制作步骤

​ ①将准备好的11.png文件和22.txt文件放到桌面
​ ②在cmd命令界面输入copy 11.png /b +22.txt /a server_info.php命令即可将两个文件合成文件头是图片而木马代码在末尾server_info.php文件,这样在上传图片时就可以成功绕过file_handle.php文件中对文件头的过滤了。但同时在最后运行攻击文件时需要拉到页面最下面才能看到我们获取的服务器信息。

在这里插入图片描述

3、server_info.php文件主要代码(即用于合成的22.txt文件代码)
<!doctype html>
<html>
    <head>
        <meta  charset="gb2312"/>
        <title>服务器信息</title>
    </head>
    <body>
        <table >
            <th colspan="2">服务器信息展示</th>
            
			<tr>
                <td>当前服务器操作系统类型:</td>
                <td><?php echo PHP_OS; ?></td>
            </tr>
            <tr>
                <td>当前服务器时间:</td>
                <td><?php 
                date_default_timezone_set("Asia/Shanghai");        
                echo date('y-m-d H:i:s',time());?></td>
            </tr>
			
			<tr>
			    <td>当前系统类型及版本号:</td>
			    <td><?php echo php_uname();?></td>
			</tr>
			<tr>
			    <td>当前系统类型:</td>
			    <td><?php echo php_uname('s');?></td>
			</tr>
			
			<tr>
			    <td>当前系统版本号:</td>
			    <td><?php echo php_uname('r'); ?></td>
			</tr>
			<tr>
			    <td>当前PHP运行方式:</td>
			    <td><?php echo php_sapi_name(); ?></td>
			</tr>
			<tr>
			    <td>当前进程用户名:</td>
			    <td><?php echo Get_Current_User(); ?></td>
			</tr>
			<tr>
			    <td>当前php版本号:</td>
			    <td><?php echo PHP_VERSION; ?></td>
			</tr>
			<tr>
			    <td>当前Zend版本号:</td>
			    <td><?php echo Zend_Version(); ?></td>
			</tr>
			<tr>
			    <td>PHP安装路径:</td>
			    <td><?php echo DEFAULT_INCLUDE_PATH; ?></td>
			</tr>
			<tr>
			    <td>当前文件绝对路径:</td>
			    <td><?php echo __FILE__; ?></td>
			</tr>
			<tr>
			    <td>服务器IP:</td>
			    <td><?php echo GetHostByName($_SERVER['SERVER_NAME']); ?></td>
			</tr>
			<tr>
			    <td>接受请求的服务器IP:</td>
			    <td><?php echo GetHostByName($_SERVER['SERVER_NAME']); ?></td>
			</tr>
			<tr>
			    <td>客户端IP:</td>
			    <td><?php echo $_SERVER['REMOTE_ADDR']; ?></td>
			</tr>
			<tr>
			    <td>服务器解译引擎:</td>
			    <td><?php echo $_SERVER['SERVER_SOFTWARE']; ?></td>
			</tr>
			<tr>
			    <td>服务器系统目录:</td>
			    <td><?php echo $_SERVER['SystemRoot']; ?></td>
			</tr>
			<tr>
			    <td>服务器域名:</td>
			    <td><?php echo $_SERVER["HTTP_HOST"]; ?></td>
			</tr>
			<tr>
			    <td>服务器Web端口:</td>
			    <td><?php echo $_SERVER['SERVER_PORT']; ?></td>
			</tr>
			<tr>
			    <td>获取请求页面时通信协议的名称和版本:</td>
			    <td><?php echo $_SERVER['SERVER_PROTOCOL']; ?></td>
			</tr>
        </table>
    </body>
</html>
<?php
phpinfo();
?>

四、BuipSuite工具应用

1、设置代理:

​ 在BuipSuite中单击“代理”→“Proxy settings”→在新窗口中设置代理时因为8080端口被Apache服务器占用所以将默认端口改为8088。
在这里插入图片描述
在这里插入图片描述

2、火狐浏览器设置使用代理

​ 在浏览器设置中找到网络设置依次设置手动配置代理、代理接口、端口号、将代理用于http及https。
在这里插入图片描述

3、进入制作的上传页面文件

​ 在浏览器打开http://localhost:8080/scMidExam/file_upload.html地址
在这里插入图片描述

4、上传server_info.php文件及前端js过滤绕过

​ 单击浏览后选择server_info.php文件并打开,然后单击上传会出现提示当前文件类型不合法的提醒。这是因为JavaScript代码中设置了对文件扩展名的过滤,这时只需按F12在开发者工具中禁用JavaScript即可继续上传文件。
​ 禁用JavaScrip方法:在浏览器中按F12再按F1打开设置后,勾选“禁用JavaScrip*”即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、文件头过滤

​ 因为在过滤文件中设置了对文件头进行检查当直接上传没有与图片文件合成的攻击文件时就无法通过验证。解决方法是在cmd命令界面输入copy 11.png /b +22.txt /a server_info.php命令即可将两个文件合成文件头是图片而木马代码在末尾server_info.php文件,这样新生成的server_info.php文件就会有两部分,头部是图片格式,尾部是编写的攻击代码;从而在上传图片时就可以成功通过file_handle.php文件中对文件头的过滤了。
在这里插入图片描述
在这里插入图片描述

6、MIME过滤及绕过

​ 在完成文件头过滤绕过后再次点击上传结果如下图,这次文件上传不成功的原因是上传的server_info.php文件被file_handle.php文件接收到,而在file_handle.php文件中设置有MIME方式的过滤,默认设置只允许jpg、gif、bmp类型文件通过过滤,其三种类型文件对应的Content-Type分别为image/jpeg、image/gif、image/bmp。而.hph文件对应的Content-Type类型为application/octet-stream所以在MIME过滤时上传的server_info.php攻击文件无法通过。

在这里插入图片描述

​ 禁用JavaScript后并且合成好server_info.php文件再次点击上传时就会提示结果如下图,这次文件上传不成功的原因是上传的server_info.php文件被file_handle.php文件接收到,而在file_handle.php文件中设置有MIME方式的过滤,默认设置只允许jpg、gif、bmp类型文件通过过滤,其三种类型文件对应的Content-Type分别为image/jpeg、image/gif、image/bmp。而.hph文件对应的Content-Type类型为application/octet-stream所以在MIME过滤时上传的server_info.php攻击文件无法通过。

​ 在MIME过滤绕过时就需要通过用BuipSuite抓包工具进行抓包并将需要上传文件的Content-Type类型改为file_handle.php文件中设置的三种合法的类型之一即可成功绕过MIME类型的文件过滤从而完成server_info.php攻击文件的上传。

​ 操作步骤为:在上传文件前,先用BuipSuite工具开启拦截,然后在单击“上传”→将BuipSuite拦截到的信息中的Content-Type: application/octet-stream改为Content-Type: image/jpeg,然后单击“放行”按钮即可完成绕过,成功上传文件并返回上传成功的文件相关信息。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

五、运行上传的攻击文件返回服务器信息

1、过程及结果

​ 进入http://localhost:8080/scMidExam/upload/server_info.php地址,即可运行上传的server_info.php攻击文件。由于我们上传的攻击文件是与图片合成得到的所以运行结果的上半部分是图片的格式码,下半部分才是真正通过木马攻击文件获取到的服务器信息。运行结果运行结果如下:

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值