文件上传绕过

ID
技术描述
利用场景/条件
过程
参考
武器库关联
S1 00截断_url
  • 文件名出现在url中

当url中出现%00时就会认为读取已结束 eg:https://mp.csdn.net/upfiles/?filename=test.php%00.txt            此时输出的是test.php

ps:网上大部分教程提到这个技术,其实这个方法只适合任意文件上传后的利用,在上传php文件,因为url读取的内容在%00时就结束了,导致上传的文件一样会被拦截

https://www.jianshu.com/p/71b8b554d9b3http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88%AA%E6%96%AD%E5%88%86%E6%9E%90.html  
S2 00截断_php
  • php版本要小于5.3.4
  • magic_quotes_gpc需要为OFF状态
  • 有上传的路径且不作检查
  • %00是否要进行urldecode需要看情况

ps:有一个重点是修改上传的路径进行00截断,而不是文件名

0x开头表示16进制,0在十六进制中是00, 0x00就是%00解码成的16进制

 

 

这里在php的后面添加了一个空格和字母a,其实a写不写都可以,这里加a是为了显示空格的位置。空格是为了占位,方便修改00。然后打开hex,(空格的16进制为0x20)修改16进制内容,把20改成00:

 

 

 

 

这样上传文件时检测的是1.jpg,不会触发过滤,和路径合并后,因为00截断机制,最终保存的文件名为1.php,相当于上传了一个1.php的文件


另外:
  • path大多数都是存放在表单中的,因此需要在数据包中进行urldecode操作使%00变成字符串结束符号
  • 如果path在非enctype=multipart/form-data的表单中或URL or Cookie中的时候,就可以直接写%00不需要进行URLdecode操作,让服务端对%00进行URL解码即可。
https://www.jianshu.com/p/71b8b554d9b3http://www.admintony.com/%E5%85%B3%E4%BA%8E%E4%B8%8A%E4%BC%A0%E4%B8%AD%E7%9A%8400%E6%88%AA%E6%96%AD%E5%88%86%E6%9E%90.html  
S3

客户端JavaScript检测

客户端进行了JS校验检测
  • 直接本地禁用JS,不让其做检测 
  • 抓包,修改文件后缀名类型,绕过检测限制
https://www.cnblogs.com/TomDwan/p/14550984.html  
S4

服务器后端检测_

文件类型检测

检验请求中content-type是否符合可接受的上传类型

抓包将http请求头中的content-type改为可接受图片形式,即可绕过,如

"image/gif"

"image/png"

"image/jpeg"

https://www.cnblogs.com/TomDwan/p/14550984.html  
S5

服务器后端检测_

文件头类型检测 

使用getimagesize()函数来获取文件的MIME类型,通过文件头进行判断文件类型

先使用编辑工具在数据最前面添加图片的文件头进行伪造,即可绕过,如:

gif: GIF89ajpg

jpeg: FF D8 FF

png: 89 50 4E 47 0D 0A

https://www.cnblogs.com/TomDwan/p/14550984.html  

S6

服务器后端检测_

文件内容检测

对文件的内容做检测

从特殊敏感字符开始进行Fuzz测试,探测webshell中有多少必要的字符存在被替换,如果构成webshell执行的字符被替换得较多,剩下未过滤的字符的难以支撑webshell执行,可以换个角度利用系统,调用脚本语言,如<script language='php'>system('ls');<script>

https://www.cnblogs.com/TomDwan/p/14550984.html  
S7 二次渲染 主要就是后端调用了php的GD库,利用imagecreatefromjpeg()函数提取了文件中的图片数据,然后再重新渲染 借鉴二进制中钩子的思想,其实就是在上传图片中找一块"地方",存储webshell,这块"地方"要求在后端处理后没有被过滤掉。那就上传一个正常的文件,然后下载下来,diff一下,查看哪些位置没有被改动过,然后添加webshell进行尝试。 https://www.cnblogs.com/TomDwan/p/14550984.html  
S8 IIS 5.x/6.0解析漏洞

IIS 5.x/6.0

1.目录解析

1
/xx.asp/xx.jpg   如:test.asp/test.jpg

即:新建一个名为”test.asp”的目录,该目录中的任何文件都被IIS当做asp程序执行(特殊符号是”/“)
2.文件解析

1
test.asp;.jpg

即分号后的不被解析,仍被IIS当做asp程序执行。

https://zerlong.com/300.html  
S9

IIS7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞

  • IIS7.0/IIS 7.5
  • Nginx <8.03
  • php开启Fast-CGI

在默认Fast-CGI开启状况下,上传一个名字为wooyun.jpg,内容为
<?PHP fputs(fopen(‘shell.php’,’w’),'<?phpeval($_POST[cmd])?>’);?>的文件,然后访问wooyun.jpg/.php,在这个目录下就会生成一句话木马 shell.php


原理:IIS和Nginx在这一点上是一样的,一看到URL中文件后缀是.php,便无论该文件是否存在,都直接交给php处理,而php又默认开启“cgi.fix_pathinfo”,会对文件路径进行“修理”,何谓“修理”?举个例子,当php遇到文件路径“/aaa.xxx/bbb.yyy/ccc.zzz”时,若“/aaa.xxx/bbb.yyy/ccc.zzz”不存在,则会去掉最后的“/ccc.zzz”,然后判断“/aaa.xxx/bbb.yyy”是否存在,若存在,则把“/aaa.xxx/bbb.yyy”当做文件“/aaa.xxx/bbb.yyy/ccc.zzz”,若“/aaa.xxx/bbb.yyy”仍不存在,则继续去掉“/bbb.yyy”,以此类推。

https://yinwc.github.io/2018/07/02/iis%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E/https://zerlong.com/300.html  
S10

Windows操作系统规则

  • windows
  • 在windows环境下,xx.jpg[空格] 或xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,通过抓包,在文件名后加一个空格或者点绕过黑名单。若上传成功,空格和点都会被windows自动消除,这样也可以getshell。
  • 在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,如

    phpinfo.php::$DATA

https://yinwc.github.io/2018/07/02/iis%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E/https://blog.csdn.net/weixin_44032232/article/details/109005766  
S11

Nginx空字节代码执行漏洞

nginx version0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37 Nginx在图片中嵌入PHP代码然后通过访问
xxx.jpg%00.php可以解析php代码,所有可以构造图片马进行解析,下面S17有图片马的构造方法
https://zerlong.com/300.html  
S12 绕过安全狗 安全狗4.0
  • 两个=或者三个=都可以达到绕过的效果

 

 


  • 文件名中间加符号扰乱某狗匹配,经测试 ";" " " " ' " 均可,如:

 

 


  • 切断filename= 和 之后的值,则可以绕过

 

 


  • 文件名换行,即hex加入0a,也可以绕过

 

 

https://mp.weixin.qq.com/s?__biz=MzI5MDU1NDk2MA==&mid=2247496973&idx=1&sn=6843d879919ee0ee69311cc4befc05ec&chksm=ec1ca032db6b2924c5a7b7e2f38ff6e4fabbc16dca1332fd8166b18965253e13c618737dea7e#rd  
S13 apahce换行解析漏洞 Apache 2.4.0~2.4.29
如下图,已上传一个“6.php换行符”文件。(上传过程后文有记载,在linux可使用如下方法发现文件名后面有换行符:“cat 文件名前部分+Tab键”,如cat 6.p+Tab键)浏览器访问:http://192.168.131.136/upload/upload-labs/master/upload//6.php%0a(访问链接最后加%0a)

 

 

https://zhuanlan.zhihu.com/p/125115734  
S14

Apache多后缀解析漏洞

使用module模式与php结合的所有版本 apache存在未知扩展名解析漏洞(如果是使用fastcig模式与php结合的所有版本apache不存在此漏洞)

上传index.php.abc文件

Apache会将其解析为php文件。这样可以绕过后台的后缀检测

https://zhuanlan.zhihu.com/p/125115734  
S15 条件竞争
  • 服务器先将文件上传到文件夹中,然后检测文件后缀名,不符合过滤条件再删掉
  • 访问目录有写权限

首先上传一个可以在访问路径下写入webshell的php文件,

同时我们使用多线程并发的访问刚刚上传的文件,总会有一次在上传文件到删除文件这个时间段内访问到上传的php文件,一旦我们成功访问到了上传的文件,那么它就会向服务器写一个webshell文件。

https://cloud.tencent.com/developer/article/1650655  
S16 黑名单绕过 服务器使用黑名单进行过滤,可以尝试使用其他的后缀名绕过
  • php:php3、php4、php5、php7、phtml、pht
  • IIS6.0 默认的可执行文件除了asp还包含这三种
    /wooyun.asa
    /wooyun.cer
    /wooyun.cdx
   
S17 图片马 需要结合文件包含漏洞或者其他解析漏洞 copy a.jpg/b+yi.asp/a b.jpg          (a.jsp是正常图片,yi.asp是木马,最后b.jpg是图片马,结合文件包含漏洞可以利用)    
S18 zip文件自解压
  • 允许上传zip文件
  • 并且zip文件可自解压
如果解压后的路径不变的话比较容易利用,比如上传a.zip后自动解压出a.php,那么上传成功    
S19 大小写&双写绕过 服务器过滤规则不严谨的情况下

大小写:c.AsP

双写:c.asaspp

   
S20 .htaccess绕过
  • apache
  • 没有禁用.htaccess
  • 上传内容为:

eg:SetHandler application/x-httpd-php      或AddType application/x-httpd-php .jpg

的.htaccess文件(具体内容根据语言和apache版本决定)使得原本无害的后缀文件强制使用php或其他语言进行解析

  • 上传带有可执行代码的正常后缀的文件,如S17上面提到的图片马
   
           
 
posted @ 2021-10-11 16:08  梦幻泡影离殇  阅读(267)  评论(0编辑  收藏  举报