文件上传绕过

解题链接: http://ctf5.shiyanbar.com/web/upload 

首先随手上传了一个图片,


得到返回:



再尝试php文件,得到返回


很明显,题意为卡住php后缀,逼迫你上传文件后缀为jpg等类型,典型的上传绕过问题上传绕过解题思路可参考我转载的【文件上传检测的基本思路】,一般按照思路逐步尝试即可,简单的大小写,加后缀不可过,此题无js,猜测为0x00截断上传,此处仔细分析何为0x00截断上传及其原理

简单举个例子:

[php]  view plain  copy
  1. <%   
  2. path="upfiles/picture/"   
  3. file="20121212.jpg"   
  4. upfilename=path & file '最后的上传地址   
  5. %>   

upfilename即为最终名字,意思为如果地址为picture/1.php+,文件名为1.jpg则最终上传上去的文件路径为picture/1.php+1.jpg,0x00截断的思路即为将+之后的内容忽略掉使上传文件1.jpg最终上传到1.php中,此处利用到的就是0x00的截断漏洞,下面用题目做具体说明:

首先bp上传图片,将数据包发到repeater,并对/uploads/后面加上1.php+,此处相当于上述例子中的path:


然后打开hex(16进制),找到+对应的编码:


0x00的意思为16进制00,所以讲+对应的进制改成00(至于怎么找到对应代码,看右边对应代码,找到第几行,从左到右,每个字母对应一个代码),改完直接go



上传绕过的方法总结:

1: 前台脚本检测扩展名—绕过
原理
当用户在客户端选择文件点击上传的时候,客户端还没有向服务器发送任何消息,就对本地文件进行检测来判断是否是可以上传的类型,这种方式称为前台脚本检测扩展名。

绕过方法

绕过前台脚本检测扩展名,就是将所要上传文件的扩展名更改为符合脚本检测规则的扩展名,通过BurpSuite工具,截取数据包,并将数据包中文件扩展名更改回原来的,达到绕过的目的。
例如:文件名本来为【evil.jpg】,上传时,用BurpSuite截包后,将数据包中的名字改为【evil.php】(或其它脚本类型)即可。


2: Content-Type检测文件类型—绕过
原理
当浏览器在上传文件到服务器的时候,服务器对说上传文件的Content-Type类型进行检测,如果是白名单允许的,则可以正常上传,否则上传失败。

绕过方法

绕过Content--Type文件类型检测,就是用BurpSuite截取并修改数据包中文件的Content-Type类型(如改为:image/gif),使其符合白名单的规则,达到上传的目的。


3: 文件系统00截断—绕过

原理

在上传的时候,当文件系统读到【0x00】时,会认为文件已经结束。利用00截断就是利用程序员在写程序时对文件的上传路径过滤不严格,产生0x00上传截断漏洞。

绕过方法

通过抓包截断将【evil.php.jpg】后面的一个【.】换成【0x00】。在上传的时候,当文件系统读到【0x00】时,会认为文件已经结束,从而将【evil.php.jpg】的内容写入到【evil.php】中,从而达到攻击的目的。

4: 服务器端扩展名检测黑名单—绕过
原理


当浏览器将文件提交到服务器端的时候,服务器端会根据设定的黑白名单对浏览器提交上来的文件扩展名进行检测,如果上传的文件扩展名不符合黑白名单的限制,则不予上传,否则上传成功。

绕过方法

将一句话木马的文件名【evil.php】,改成【evil.php.abc】(奇怪的不被解析的后缀名都行)。首先,服务器验证文件扩展名的时候,验证的是【.abc】,只要该扩展名符合服务器端黑白名单规则,即可上传。另外,当在浏览器端访问该文件时,Apache如果解析不了【.abc】扩展名,会向前寻找可解析的扩展名,即【.php】

5: JS检测上传文件—绕过

原理


上传文件时,对方使用JavaScript语句语法检测上传文件的合法性问题。

绕过方法

在本地浏览器客户端禁用JS即可。可使用火狐浏览器的NoScript插件、IE中禁用掉JS等方式实现。


6: 重写解析规则—绕过
原理

上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。

绕过方法

在可以上传.htaccess文件时,先上传.htaccess文件,覆盖掉原先的.htaccess文件;再上传【evil.gif】文件。使用如下的.htaccess语句,即可将【evil.gif】文件以php脚本方式解析。
<FilesMatch "evil.gif">

SetHandler application/x-httpd-php
</FilesMatch>


7: 其它方式—绕过
原理

部分程序员的思维不严谨,并使用逻辑不完善的上传文件合法性检测手段,导致可以找到方式绕过其检测方式。

绕过方法

1. 后缀名大小写绕过
用于只将小写的脚本后缀名(如php)过滤掉的场合;
例如:将Burpsuite截获的数据包中的文件名【evil.php】改为【evil.Php】


2. 双写后缀名绕过
用于只将文件后缀名,例如"php"字符串过滤的场合;
例如:上传时将Burpsuite截获的数据包中文件名【evil.php】改为【evil.pphphp】,那么过滤了第一个"php"字符串"后,开头的'p'和结尾的'hp'就组合又形成了【php】。


3. 特殊后缀名绕过
用于检测文件合法性的脚本有问题的场合;

例如:将Burpsuite截获的数据包中【evil.php】名字改为【evil.php6】,或加个空格改为【evil.php 】等。

参考:

https://blog.youkuaiyun.com/wy_97/article/details/76549405

https://blog.youkuaiyun.com/wy_97/article/details/76549761

http://www.ac166.cn/post-134.html


在Web安全测试中,文件上传漏洞是一种常见的安全隐患,攻击者可以通过绕过文件上传限制将恶意代码植入服务器。upload-labs靶场提供了一个练习此类渗透技术的环境,其中包含了多种不同类型的文件上传漏洞场景。 ### 文件上传绕过方法 #### 客户端验证绕过 一些网站仅依赖于前端JavaScript来检查上传文件的类型,这通常可以通过禁用或修改浏览器中的脚本来实现绕过。例如,在第一关中,可以使用三种方法完成渗透:修改MIME类型、使用Burp Suite拦截并更改请求内容或者直接构造POST请求上传非允许类型的文件[^1]。 #### 服务端验证绕过 对于后端验证,开发者可能会采用黑名单机制阻止特定扩展名(如`.php`)的文件上传。然而,这种做法容易被利用,比如通过上传具有其他可执行扩展名(如`.phtml`, `.php5`, `.pht`等)的文件来规避检测。此外,还可以尝试利用`.htaccess`文件或者其他配置文件来改变服务器行为,以允许执行原本被禁止的脚本语言。 #### 特殊文件格式绕过 某些情况下,服务器可能只接受图片文件。这时可以创建一个包含PHP代码的图片马(image horse),即所谓的“图片马”。由于`getimagesize()`函数会读取目标文件的文件头来判断是否为图片文件,因此仍然可以使用Pass-14的方法进行绕过。同样地,如果遇到使用了`exif_imagetype()`函数的情况,则需要确保上传的文件确实是一个合法的图像文件头,同时嵌入恶意代码[^4]。 #### 配置错误与解析漏洞 有时候服务器配置不当也可能导致安全问题。例如,在第五关中发现了一个`.ini`文件被用来作为上传白名单控制,通过构造特殊的文件名和路径,能够使得服务器误将非预期类型的文件当作合法文件处理。另外,若服务器存在解析漏洞,比如Apache服务器错误地将`.php.jpg`这样的文件名解析为`.php`文件,则同样可以借此上传webshell[^3]。 #### 绕过后缀黑名单 当面对严格的后缀黑名单时,可以考虑寻找是否存在双重扩展名处理缺陷,或是尝试上传带有空格、点号结尾的文件名,因为这些特殊字符有时会被过滤器忽略掉。还有就是利用Windows系统对长文件名的支持特性,构造出看似正常但实际上含有隐藏恶意扩展名的文件名。 ```python # 示例:生成一个简单的图片马 from PIL import Image import os def create_image_with_shellcode(output_filename): # 创建一个新的空白图像 img = Image.new('RGB', (1, 1), color = (73, 109, 137)) # 将PHP shellcode写入到图像数据中 php_code = "<?php system($_GET['cmd']); ?>" data = bytearray(php_code, 'utf-8') + b'\x00' * (len(data) % 4) # 填充至4字节边界 # 修改图像数据部分 pixels = list(img.getdata()) new_pixels = [] for pixel in pixels: r, g, b = pixel if len(data) > 0: r ^= data.pop(0) new_pixels.append((r, g, b)) img.putdata(new_pixels) img.save(output_filename) create_image_with_shellcode("malicious.jpg") ``` 以上代码演示了如何生成一个携带简单PHP命令执行功能的JPEG图片文件,它可以在支持PHP并且没有正确校验上传文件内容的服务器上运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值