51.网络安全渗透测试—[文件上传篇1]—[文件上传过程详解/造成漏洞原因/文件上传绕过姿势]

我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!

一、文件上传过程详解

1、文件上传过程:5步

  • 第一步:客户端选择发送的文件
  • 第二步:服务器接收
  • 第三步:网站程序判断
  • 第四步:生产临时文件
  • 第五步:移动到指定的路径

2、客户端上传表单: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>

3、服务器接收资源的脚本程序: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"];
	}
?>

4、文件上传错误代码:5类值

  • 值:0;       表示:没有错误发生,文件上传成功。

  • 值:1;       表示:上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。

  • 值:2;       表示:上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

  • 值:3;       表示:文件只有部分被上传。

  • 值:4;       表示:没有文件被上传。

5、网站文件常见的扩展名:asp/php/........

	asp
	asa
	cdx
	cer
	php
	aspx
	ashx
	jsp
	php3
	php.a
	shtml
	phtml
	//过滤的时候可以传入这种格式:aspasp、phpphp、Asp、PhP等等

二、文件上传绕过姿势

造成漏洞的原因和绕过姿势

(1)程序代码和系统缺陷:未作任何的限制

         文件可以直接上传可执行脚本:moon.php

(2)前端 js脚本验证绕过姿势:

         法一:保存页面,修改html

         法二:抓包改包

         法三:浏览器禁止js文件运行

(3)扩展名黑名单过滤不全:穷举后缀名

         扩展名黑名单含义:指定的后缀名是禁止上传的,一般穷举后缀即可绕过

(4)扩展名穷举字典:

	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
	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

(5)扩展名白名单含义:就是允许上传文件后缀,如jpg png gif 等其他图片格式

(6)content-type文件类型的检测:抓包修改文件类型即可

(7)文件头检测:修改文件头或制作图片一句话

         JPEG (jpg) 文件头:FFD8FF

         PNG (png) 文件头:89504E47

         GIF (gif) 文件头:47494638

         TIFF (tif) 文件头:49492A00

         Windows Bitmap (bmp) 文件头:424D

         制作图片一句话:copy test.gif/b+moon.php shell.php

(8)文件名可控且后缀名不可控:

  • IIS6.0文件解析漏洞:

         漏洞情形:文件名可控,但文件后缀只能是jpg,可利用iis6.0漏洞。

         moon.asp;.jpg,可上传,可解析。

         moon.asp;jpg,虽不能上传,但是可以解析。

         分析:(moon.asp;.jsp)(文件名是moon.asp;)(后缀名是.jpg)(其中文件名的分号,相当于一个注释符号)

  • IIS6.0目录解析漏洞:

         漏洞情形:上传文件夹为*.asp,只要上传文件到这个文件夹里,后台就会把任何文件当作asp解析执行

         注意:IIS6.0 默认的可执行文件除了asp还包含这三种 *.asa *.cer *.cdx

(9)%00截断的应用场景:

         场景一:直接截断文件名。

         场景二:创建目录可控时,%00截断创建目录,同时利用IIS6.0解析漏洞 上传文件到这个目录里面,即可让任何文件都被当作asp脚本所解析执行。

         场景三:截断参数,生成文件。

(10)程序逻辑出错场景:

         场景一:双文件上传

         场景一:空格文件上传

(11)部署环境出错:

         apache开启重写模块:LoadModule rewrite_module modules/mod_rewrite.so

         重写解析文件:.htaccess

         .htaccess文件内容:

	<FilesMatch "qwsn">
	SetHandler application/x-httpd-php
	</FilesMatch>
	// 一旦文件名匹配到了qwsn四个字符,就被当作php解析执行

(12)nginx解析漏洞:Nginx1.4.6

  • 原理:
             Nginx拿到文件路径(更专业的说法是URI)/1.jpg/*.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/1.jpg/*.php不存在,便删去最后的/*.php,又看/1.jpg存在,便把/1.jpg当成要执行的文件了,又因为后缀为.jpgphp认为这不是php文件,于是返回Access denied
            这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项PHP可以对文件路径进行修理
            举个例子,当php遇到文件路径/1.jpg/2.txt/3.php时,若/1.jpg/2.txt/3.php不存在,则会去掉最后的/3.php,然后判断/1.jpg/2.txt是否存在,若存在,则把/1.jpg/2.txt当做文件/1.jpg/2.txt/3.php,若/1.jpg/2.txt仍不存在,则继续去掉/2.txt,以此类推。

  • 利用姿势:
            姿势1:1.jpg/1.php
            姿势2:1.jpg%00.php
            姿势3:1.jpg/%20\0.php

(13)IIS7.0/7.5/nginx的配置错误: 1.jpg/*.php

  • 原理:
            IIS7.5 IIS7.0的漏洞与nginx的类似,都是由于php配置文件中,开启了cgi.fix_pathinfo,而这并不是nginx或者IIS7.0 | 7.5本身的漏洞。

  • 环境要求:cgi.fix_pathinfo = 1

  • IIS服务器解析漏洞处理过程:当IIS服务器遇到文件路径/1.jpg/test.php时,若/1.jpg/test.php不存在,则会去掉最后的/test.php,然后判断/1.jpg是否存在,该目录下/1.jpg存在,由于服务器配置不当,造成了服务器把1.jpg当做了php脚本执行了。

(14)系统特性:

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

(15) NTFS交换数据流:

        形式一::$DATA 创建文件

        形式二:::$DATA 创建和写入文件

(16)补充:

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qwsn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值