【文件上传】关于文件后缀名加点.绕过的算法解析

admin 2023年2月18日10:03:05评论62 views字数 959阅读3分11秒阅读模式

0x01 简介

在文件上传的时候,可以用这样的方法来绕过,比如加本身禁止文件上传的后缀为1.php,但是如果后台写的是黑名单,可以通过这样的后缀1.php.来进行绕过,原理就是因为后台没有对.符号进行清除处理, 然后.字符到了windows上会被自动清除掉,因此导致了上传绕过

这里创建一个1.php.文件

【文件上传】关于文件后缀名加点.绕过的算法解析

创建完毕.就自动不见了

【文件上传】关于文件后缀名加点.绕过的算法解析

但是linux.是不会消失的

【文件上传】关于文件后缀名加点.绕过的算法解析

这个特性只建立在后台是windows的基础上

0x02 进阶

如果后台已经对.做了过滤 如下所示

【文件上传】关于文件后缀名加点.绕过的算法解析

这是一套删除.的算法,如果加了这样的东西

那么后台就会把文件最后一个.去除掉,就无法进行上传了

文件上传上去是这个样子

【文件上传】关于文件后缀名加点.绕过的算法解析
【文件上传】关于文件后缀名加点.绕过的算法解析

可以看到.已经被去除了 然后再把php后缀加入黑名单

【文件上传】关于文件后缀名加点.绕过的算法解析

上传是肯定无法成功的

那么这种情况有没有办法进行绕过呢,其实是有的

我们注意观察这套算法,其实是有缺陷的

下面进行解析

如果是正常键入333.php,后面是不含.的文件名,会走第一段if逻辑

也就是说,这里的$i是等于变量的总长度-1的,同时最后一位c也不为.

因此直接返 回$s

也就是原本的文件名

333.php

【文件上传】关于文件后缀名加点.绕过的算法解析

但是如果存在

333.php.

这样的文件名,因为文件的最后一位就是.,不满足$c != '.'这个条件

所以

【文件上传】关于文件后缀名加点.绕过的算法解析

这一段逻辑就是无法通过的,只能继续往下走,那么走到下面

【文件上传】关于文件后缀名加点.绕过的算法解析

这一段逻辑依旧无法通过,所以重新跳回for循环语句,这里做自减操作

【文件上传】关于文件后缀名加点.绕过的算法解析

ok,自减完毕之后,由于$i的值已经少了一位,不能满足这个条件

【文件上传】关于文件后缀名加点.绕过的算法解析

所以只能往下走

判断

【文件上传】关于文件后缀名加点.绕过的算法解析

这里的c其实就是当前字符串的最后一位,因为c是由游标i控股的

i已经少了一位,那么这里的就是倒数往前一个字符 

例如

一开始是333.php. c的值是.

而i作为游标已经自减了 那么这里再取c的值,就是p

然后判断c不为.成立了 就截取这一段字符 返回333.php

这套算法粗看没有问题,但是仔细研究依旧存在绕过的方法,因为这里的逻辑是

只要删除最后一个.,然后往前推一位,如果不为点,就可以返回全部的字符串。

这里可以构造333.php. .

也就是333.php点空格点来进行绕过 我们来尝试一下

【文件上传】关于文件后缀名加点.绕过的算法解析【文件上传】关于文件后缀名加点.绕过的算法解析

看到了吗,结果依然保留了一个点,其实这个字符是333.php.空格

【文件上传】关于文件后缀名加点.绕过的算法解析

蓝色的部分就是空格,用这个文件名,就可以对这个算法进行绕过

尝试上传一个shell

【文件上传】关于文件后缀名加点.绕过的算法解析

成功上传

【文件上传】关于文件后缀名加点.绕过的算法解析

连接成功

【文件上传】关于文件后缀名加点.绕过的算法解析

【文件上传】关于文件后缀名加点.绕过的算法解析

原文始发于微信公众号(猫因的安全):【文件上传】关于文件后缀名加点.绕过的算法解析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月18日10:03:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【文件上传】关于文件后缀名加点.绕过的算法解析http://cn-sec.com/archives/1271260.html

发表评论

匿名网友 填写信息