文件上传
在文件上传的时候,可以用这样的方法来绕过,比如加本身禁止文件上传的后缀为1.php,但是如果后台写的是黑名单,可以通过这样的后缀
1.php.
来进行绕过,原理就是因为后台没有对.符号进行清除处理
然后.字符到了windows上会被自动清除掉,因此导致了上传绕过
这里创建一个1.php.文件
创建完毕.就自动不见了
但是linux中.是不会消失的进阶
如果后台已经对.做了过滤
这是一套删除.的算法,如果加了这样的东西,那么后台就会把文件最后一个.去除掉,就无法进行上传了。
文件上传上去是这个样子
可以看到.已经被去除了
然后再把php后缀加入黑名单
上传是肯定无法成功的。
那么这种情况有没有办法进行绕过呢,其实是有的。
我们注意观察这套算法,其实是有缺陷的,下面进行解析
如果是正常键入333.php,后面是不含.的文件名,会走第一段if逻辑,也就是说,这里的$i是等于变量的总长度-1的,同时最后一位c也不为.,因此直接返
回$s,也就是原本的文件名,333.php
但是如果存在
333.php.
这样的文件名,因为文件的最后一位就是.,不满足$c != ‘.’这个条件,所以
这一段逻辑就是无法通过的,只能继续往下走,那么走到下面
这一段逻辑依旧无法通过,所以重新跳回for循环语句,这里做自减操作自减完毕之后,由于$i的值已经少了一位,不能满足这个条件所以只能往下走,判断
这里的c其实就是当前字符串的最后一位,因为c是由游标i控股的,i已经少了一位,那么这里的就是倒数往前一个字符
例如
一开始是333.php.
c的值是.
而i作为游标已经自减了
那么这里再取c的值,就是p
然后判断c不为.成立了
就截取这一段字符
返回333.php
这套算法粗看没有问题,但是仔细研究依旧存在绕过的方法,因为这里的逻辑是,只要删除最后一个.,然后往前推一位,如果不为点,就可以返回全部的字
符串。
这里可以构造333.php. .
也就是333.php点空格点来进行绕过
蓝色的部分就是空格,用这个文件名,就可以对这个算法进行绕过
尝试上传一个shell
上传并连接成功
暂无评论内容