黑名单绕过

Pass-03
有的时候后端限制了一些黑名单,比如过滤后缀名.php

我们就可以用黑名单里没有的后缀名进行绕过,例如:

  1. 大小写:.phP .pHp .AsP
  2. php1 .php2 .php3 .php9 .phtml(成功率较高)
  3. 特殊文件名绕过

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

于是我们先上传一个shell.jpg,然后抓包把后缀名改为.php1

发现浏览器按照原文展示,并没有按照php解析这个木马,那我们就尝试别的后缀
3我尝试了php1-9,都不行,好在最后尝试了一下phtml,成功了,最后蚁剑一连就行啦

白名单绕过-GET型00截断

当我们遇到白名单了,只允许上传.jpg|.png|.gif

这里先介绍0x00是一个Hex编码,他表示一个空字符(可以理解为一个不可见的字符串)
在这里插入图片描述 %00与0x00类似,在URL编码下表示为空字符,URL中%00解码成16进制就是0x00

Pass-11

分析上传包,与之前的关卡不同,请求头第一行多了一个save_path的东西,把我们已知的先填上,先把Content-Disposition的filename改成”1.jpg”
在这里插入图片描述

我们猜测这个save_path的作用是指定上传之后的文件具体保存的路径,使的Response里面的src在../upload目录下,那么我们就对这个目录动手了

尝试改一下,发现上传出错,因为目录里没有这个文件,而且我们没有权限新建这个文件
继续证明我的思路,我用上帝视角在upload文件夹里面新建了一个文件夹叫做123

再次抓包,往这个123文件夹里传图片

按照预期出现了这个上传的图片

这就证明了我们的拼接路径理论
新的上传思路就出来了:我们只需要在save_path里面随便起一个名字.php再用%00解码后的空字符截断后面的拼接上来的其他数据即可

后面这个正方型就是代表了一个不可见字符,后续步骤就一样了在文件夹中可以看到文件名就为zyh.php

白名单绕过-POST型00截断

Pass-12
我们抓包一看,save_path的地方跑到了post数据的区域

抓包分析小技巧:只要是在请求包第一个回车之后的参数全部都是post数据,在请求头第一行的是get数据


我们故技重施,发现失败了
原因在于GET传参和POST传参不同,post数据的特点是我们把包发过去之后,服务器会进行URL二次编码,编码后的参数到了后端再解码执行,相当于传到服务器的是%25%30%30,到了后端还是%00

我们有了新的思路,先给他解码传上去,再让他经过编码解码,到后端还是空字符,选中00%右键转换编码

通杀方法

最后再介绍一个通杀的解法,只要对方服务器不对我们上传的文件进行重命名,那我们可以在filename参数里面直接拼接一个1.php%00.jpg,再对%00进行解码,服务器前后端的校验都可以绕过