不安全文件下载与上传之——上传漏洞之——路径/扩展名绕过之——黑名单白名单绕过

黑名单绕过与白名单绕过

(这标题也忒长了点了)
大家谁懂那个如何针对 php和windows环境的叠加绕过文件上传 (不是DATA,是另一个特性) 这个绕过 进行一些防御呢

文件大小写

		改变大小写

防御

:统一转换为小写

名单绕过

比如黑名单里没有.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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|.htaccess后缀文件之类

需要注意一下两类

.htacess

				<FilesMatch"">
				SetHandler application/x-httpd-php
				</FilesMatch>
				
				作用:
				用户上传的所有文件都以php执行
					再上传一个含着木马的图片就可以连接菜刀了

php3扩展名

防御

:尽可能写全

php和windows环境的叠加绕过文件上传

利用PHP 和 Windows环境的叠加特性,以下符号在正则匹配时的相等性,此方法需要上传两次
双引号" = 点号.
大于符号> = 问号?
小于符号< = 星号*
先上传一个名为4.php:.jpg的文件,上传成功后会生成4.php的空文件,大小为0KB一句话木马并没有写入.
然后在重发器将文件名改为4.<或4.<<<或4.>>>或4.>><后再次上传,重写4.php文件内容,Webshell代码就会写入原来的4.php空文件中。

防御

没有找到相关资料 ,找到会补充

补充:

可以采用 对文件统一进行随机重命名,或限制其类型即所谓的白名单限制

点和空格突破文件上传

把文件名改成test.asp. 或test.asp_(下划线为空格),这种命名方式在windows 系统里是不被允许的,所以需要在burp
之类里进行修改,然后绕过验证后,会被windows
系统自动去掉后面的点和空格,这里我们利用burp进行修改做绕过,但要注意Unix/Linux 系统没有这个特性。

防御

:首尾去空格,删除文件名末尾的点

  		再绕过用文件名+点+空格+点

(这里感觉一层一层 你来我往,魔高一尺道高一丈啊)

windows文件流 ::$DATA绕过

		 是Windows下NTFS文件系统的一个特性,即NTFS文件系统的存储数据流的一个属性 DATA 时,就是请求 a.asp 本身的数据,如果a.asp 还包含了其他的数据流,比如 a.asp:lake2.asp,请求 a.asp:lake2.asp::$DATA,则是请求a.asp中的流数据lake2.asp的流数据内容。
			1.php::$DATA , 上传成功后保存的文件名其实是1.php

防御

$file_ext =str_ireplace('::$DATA',"$file_ext")
用来去除字符串::$DATA

双写文件扩展名绕过

由于 $file_name = str_ireplace($deny_ext,"", $file_name)
只对文件后缀名进行一次过滤,也就是假如上传了一个php文件,就把php后缀去掉了
这样的话,双写文件名绕过,文件名改成1.pphphp

0x00截断

> 	name = getname(http request) //假如这时候获取到的文件名是test.asp .jpg(asp
> 后面为0x00) 			type = gettype(name)
> //而在gettype()函数里处理方式是从后往前扫描扩展名,所以判断为jpg 			if (type == jpg)
> 			SaveFileToPath(UploadPath.name, name) //但在这里却是以0x00 作为文件名截断
> 			                 //最后以test.asp 存入路径里

小结:

感觉各种防御方法虽然很多,但是破解方法也很多,若果要做到真的全面,我认为还是应该像《白帽子讲web安全》一书中采用白名单的办法,更加高效更加全面

白名单绕过

0x00截断或test.asp%00.jpg

	0x00截断(16进制空格)

使用情况

		遇到对文件统一进行随机重命名(例如利用时间戳),或限制其类型的情况下
$ext_arr = array(‘jpg‘,‘png‘,‘gif‘);
	 5 $file_ext = substr($_FILES[‘upload_file‘][‘name‘],strrpos($_FILES[‘upload_file‘][‘name‘],".")+1);

代码解读

name = getname(http request) //假如这时候获取到的文件名是test.asp .jpg(asp 后面为0x00)
		type = gettype(name) //而在gettype()函数里处理方式是从后往前扫描扩展名,所以判断为jpg
		if (type == jpg)
		SaveFileToPath(UploadPath.name, name) //但在这里却是以0x00 作为文件名截断
				         //最后以test.asp 存入路径里

实际操作

不过这需要对文件有足够的权限(对路径的可修改权限),
比如说创建文件夹,上传的文件名写成1.jpg,

在burp中修改save_path改成…/upload/1.php%00

(注意有时候修改路径的地方是不确定的,需要依照情况自己找可以修改的路径)

也就是说服务器读取的全部命令是…/upload/1.php%00 /1.jpg,只不过会把%00及之后的东西删除
(1.php%00.jpg经过url转码后会变为1.php\000.jpg),最后保存下来的文件就是1.php

思路

既然限制了文件名,那我们只好在路径上做一些改动,文件名虽然是符合标准的,经过截断之后,用于绕过文件名限制的图片格式名称就会被截断,有点工具名那意思,用完了.jpg就杀掉了,把有用的.php伪装成目录藏起来,经过截断处理才显露原形

防御

修复建设: php版本要小于5.3.4,5.3.4及以上已经修复该问题;magic_quotes_gpc需要为OFF状态 MIME绕过

果然白名单绕过方法很少啊,而且需要很高的权限

发布了80 篇原创文章 · 获赞 8 · 访问量 4219

猜你喜欢

转载自blog.csdn.net/weixin_43079958/article/details/105353580