天天看点

51.文件上传篇一 详解文件上传过程和绕过文件上传

1、文件上传过程

01 客户端选择发送的文件->服务器接收->网站程序判断->临时文件->移动到指定的路径


02 服务器接收的资源程序:
	upload.php
	<?php
	    if ($_FILES["file"]["error"] > 0)
	      {
	      echo "Error: " . $_FILES["file"]["error"] . "<br />";
	      }
	    else
	      {
	      echo "Upload: " . $_FILES["file"]["name"] . "<br />";
	      echo "Type: " . $_FILES["file"]["type"] . "<br />";
	      echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
	      echo "Stored in: " . $_FILES["file"]["tmp_name"];
	      }
	?>

03 客户端上传表单:
	upload.html
	<html>
	 <head></head>
	 <body> 
	  <form action="upload.php" method="post" enctype="multipart/form-data"> 
	   <label for="file">Filename:</label> 
	   <input type="file" name="file" id="file" /> 
	   <br /> 
	   <input type="submit" name="submit" value="Submit" /> 
	  </form>  
	 </body>
	</html>
           

2、文件上传错误代码

值:0; 没有错误发生,文件上传成功。
值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
值:3; 文件只有部分被上传。
值:4; 没有文件被上传。
           

3、网站文件常见的后缀名

asp
asa
cdx
cer
php
aspx
ashx
jsp
php3
php.a
shtml
phtml
//过滤的时候可以传入这种格式:aspasp、phpphp、大小写转换
           

4、造成漏洞的原因

01 程序代码和系统缺陷
	a)	文件可以直接上传可执行脚本:moon.php
	
	b)	js脚本限制前端  
		i.保存页面,修改html
		ii.抓包改包
		iii. 禁止js文件运行 
		
	c)	黑名单过滤不全:穷举后缀名 moon.phtml
		i.黑名单:指定的后缀名是禁止上传的,一般穷举后缀即可
		穷举字典:
				php
				php1
				php2
				php3
				php4
				php5
				pht
				phtml
				html
				htm
				PhP
				PhP1
				PhP2
				PhP3
				PhP4
				PhP5
				PhT
				Phtml
				HTML
				HTM
				php.
				php 
				php::$DATA
				php. .
				php . 
				php ..
				php.  
				phphpp
				PhPhPP
				asp
				asa
				cdx
				cer
				php
				aspx
				ashx
				jsp
				php3
				php.a
				shtml
				phtml
				ASP
				ASA
				CDX
				CER
				PHP
				ASPX
				ASHX
				JSP
				PHP3
				PHP.A
				SHTML
				PHTML
				Asp
				Asa
				Cdx
				Cer
				Php
				Aspx
				Ashx
				Jsp
				Php3
				Php.a
				Shtml
				Phtml
 		ii.白名单:就是允许上传文件后缀,如jpg png gif 等其他图片格式
	
	d)	content-type文件类型的检测:抓包修改http文件类型即可

	e)	文件头检测:修改文件头 或 图片一句话
			JPEG (jpg),文件头:FFD8FF 
			PNG (png),文件头:89504E47 
			GIF (gif),文件头:47494638 
			TIFF (tif),文件头:49492A00 
			Windows Bitmap (bmp),文件头:424D
		制作图片一句话:
		copy 1.gif/b+moon.php shell.php

	f)	文件名可控且后缀名不可控:IIS6.0解析漏洞
		文件名可控,文件后缀只能是jpg,可利用iis6.0漏洞。(文件名:moon.asp;)(后缀.jpg)(其中文件名的分号,相当于一个注释符号)
		moon.asp;.jpg,可上传,可解析。
		moon.asp;jpg,虽不能上传,但是可以解析。
					
	e)	IIS6.0目录解析漏洞:文件夹为x.asp,只要上传文件到这个文件夹里,访问就会执行脚本

	f)	 %00截断的应用场景  
			直接截断文件名
			创建目录可控 %00截断创建目录 利用iis6.0解析漏洞 上传文件到这个目录里面
			截断参数 生成文件
		
		
02 程序逻辑出错
	双文件上传
	空格文件上传


03 部署环境
	apache开启重写模块
	LoadModule rewrite_module modules/mod_rewrite.so
	重写解析   .htaccess
	<FilesMatch "jpg">
	SetHandler application/x-httpd-php
	</FilesMatch>


04 IIS7.0/7.5/nginx的配置错误   1.jpg/.php
	iis7.0|iis7.5|nginx 开启 fast-cgi
	//https://blog.csdn.net/weixin_45588247/article/details/118889668


05 漏洞
	nginx<=0.83
	/1.jpg%00php


06 系统特性
	上传文件名a.php:.jpg的时候 会在目录下生成a.php的空白文件 
	php+window+iis
	利用PHP 和 Windows环境的叠加特性,以下符号在正则匹配时的相等性:
	双引号"     =   点号.
	大于符号>   =   问号?
	小于符号<   =   星号*
	文件名.<或文件名.<<<或文件名.>>>或文件名.>><空文件名
	写入filename.<<<


07 NTFS交换数据流
	:$DATA 创建文件
	::$DATA 创建和写入文件


08 补充
	window系统里面会把文件名的最后一个点 会自动去掉 
	如上传moon.php.最后还是会变成moon.php
           

2021.08.06 (0:17:51)