ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

渗透测试之文件上传漏洞

2021-03-31 20:01:09  阅读:441  来源: 互联网

标签:文件 asp 文件名 渗透 漏洞 绕过 php 上传


一、漏洞介绍

大多数网站都有文件上传的接口,但如果在后台开发时并没有对上传的文件进行安全考虑或采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件,从而通过该恶意文件的访问来控制整个后台

二、测试流程

image-20210328113630528

 

总结:

 

image-20210328163425125

 

三、实战测试

1、绕过js检查

(javascript 检测)首先观察到提示只允许上传图片文件,那么前端的查看代码,当页面发生改变时,会调用这个checkFileExt()函数来检查上传的是不是图片,我们只需要在前端将checkFileExt()函数删除,就能上传一个非图片文件。

image-20210328163709020

 

2、黑名单

1、绕过黑名单验证

用黑名单里没有的名单进行攻击,比如黑名单里没有.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后缀文件之类

 

猜测黑名单验证(‘.asp‘,‘.aspx‘,‘.php‘,‘.jsp‘),通过上传特殊可解析后缀的办法,我们可以尝试上传php3,php5...等这样可以被服务器解析的后缀名

2、上传.htaccess

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

 

当对上传的后缀名的判断增加了,php3.php5....已经不允许上传,但是没有限制.htaccess文件的上传,所以我们依然可以使用另外一种方法就是利用PHP 和 Windows环境的叠加特性,以下符号在正则匹配时的相等性:

双引号" = 点号.

大于符号> = 问号?

小于符号< = 星号*

先上传一个名为4.php:.jpg的文件,上传成功后会生成4.php的空文件,大小为0KB。然后将文件名改为4.<或4.<<<或4.>>>或4.>><后再次上传,重写4.php文件内容,Webshell代码就会写入原来的4.php空文件中。

3、后缀大小写绕过

猜测服务器源代码没有设置$file_ext = strtolower($file_ext); //转换为小写 ,尝试使用文件名后缀大小写混合绕过,把1.php改为1.phP...来上传

4、空格和点绕过

利用Windows系统的文件名特性。文件名最后增加空格和点,写成1.php . 这个需要用burpsuite抓包修改,上传后保存在Windows系统上的文件名最后的一个.会被去掉,实际上保存的文件名就是1.php

image-20210328191055780

 

 

6、::$DATA绕过

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

猜测服务器源代码没有设置 $file_ext = str_ireplace(‘::$DATA‘, ‘‘, $file_ext);//去除字符串::$DATA 我们可以尝试采用Windows文件流特性绕过,文件名改成1.php::$DATA , 上传成功后保存的文件名其实是1.php

7、配合解析漏洞

 

 

8、双写后缀名绕过

猜测服务器源代码 $file_name = str_ireplace($deny_ext,"", $file_name); 只对文件后缀名进行一次过滤,这样的话,双写文件名绕过,文件名改成1.pphphp

 

3、白名单

1、MIME绕过

(MIME 类型检测) MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。

第一个参数是表单的 input name,第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:

$FILES"file" - 被上传文件的名称 $FILES"file" - 被上传文件的类型 $FILES"file" - 被上传文件的大小,以字节计 $FILES"file" - 存储在服务器的文件的临时副本的名称 $_FILES"file" - 由文件上传导致的错误代码

详细可参考:http://www.w3school.com.cn/php/php_file_upload.asp

分析代码逻辑:首先会获取到前端的提交请求,然后定义了一个数组(定义图片上传指定类型),然后通过upload_sick函数对上传的文件进行一定的检查。分析upload_sick函数(定义在uploadfunction.php文件里面)存在漏洞的的原因是因为 $ _FILES() 这个全局的方法是通过浏览器http头去获取的content-type,content-type是前端用户可以控制的。容易被绕过。上传一张正常的符合标准的图片,对其content-type进行抓包操作。可见正常上传符合要求的图片中数据包中content-type为image/png对比符合条件,而php文件则不符合条件返回文件类型错误。

2、%00截断

 

3、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 存入路径里

 

猜测服务器源代码是以时间戳的方式对上传文件进行命名,使用上传路径名%00截断绕过,不过这需要对文件有足够的权限,比如说创建文件夹,上传的文件名写成1.jpg, save_path改成../upload/1.php%00 (1.php%00.jpg经过url转码后会变为1.php\000.jpg),最后保存下来的文件就是1.php

前提条件:php版本要小于5.3.4,5.3.4及以上已经修复该问题;magic_quotes_gpc需要为OFF状态

 

image-20210328195106790

 

4、0x0a截断

 

 

 

4、绕过文件头检查

方法一:直接伪造头部GIF89A 方法二:CMD方法,copy /b test.png+1.php muma.png 方法三:直接使用工具增加备注写入一句话木马。

绕过文件头检查,添加GIF图片的文件头GIF89a,绕过GIF图片检查。或者我们使用命令copy 1.jpg /b + shell.php /a webshell.jpg,将php一句话追加到jpg图片末尾,代码不全的话,人工补充完整。形成一个包含Webshell代码的新jpg图片,然后直接上传即可。但是我们没有办法拿到shell,应为我们上传的图片马无法被解析成php形式,通常图片马配合%00或者0x00截断上传,或者配合解析漏洞

image-20210328202158006

 

5、绕过 getimagesize()

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息,如果用这个涵数来获取类型,从而判断是否是图片的话,会存在问题。

语法格式:

 array getimagesize ( string $filename [, array &$imageinfo ] )

getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。

 

 

 

getimagesize() 函数用于获取图像尺寸 ,索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM

这里有详解:https://blog.csdn.net/sanbingyutuoniao123/article/details/52166617

image_type_to_extension() 函数用于获取图片后缀

 

 

 

 

6、绕过 exif_imagetype()

 

7、二次渲染

 

8、条件竞争

 

 

 

 

 

 

四、安全防范

针对文件上传漏洞的特点和必须具备的三个条件,我们阻断任何一个条件就可以达到组织文件上传攻击的目的: 1、最有效的,将文件上传目录直接设置为不可执行,对于Linux而言,撤销其目录的'x'权限;实际中很多大型网站的上传应用都会放置在独立的存储上作为静态文件处理,一是方便使用缓存加速降低能耗,二是杜绝了脚本执行的可能性; 2、文件类型检查:强烈推荐白名单方式,结合MIME Type、后缀检查等方式(即只允许允许的文件类型进行上传);此外对于图片的处理可以使用压缩函数或resize函数,处理图片的同时破坏其包含的HTML代码; 3、使用随机数改写文件名和文件路径,使得用户不能轻易访问自己上传的文件; 4、单独设置文件服务器的域名;

 

标签:文件,asp,文件名,渗透,漏洞,绕过,php,上传
来源: https://www.cnblogs.com/Shmily--tao/p/14603470.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有