黑名单绕过
Pass-03
有的时候后端限制了一些黑名单,比如过滤后缀名.php
我们就可以用黑名单里没有的后缀名进行绕过,例如:
- 大小写:.phP .pHp .AsP
- php1 .php2 .php3 .php9 .phtml(成功率较高)
- 特殊文件名绕过
比如发送的htp包里把文件名改成test.asp.或test.asp_(下划线为空格),这种命名方式在windows系统里是不被允许的,所以需要在burp之类里进行修改,然后绕过验证后,会被windows.系统自动去掉后面的点和空格,但要注意Unix/Linux系统没有这个特性。
于是我们先上传一个shell.jpg,然后抓包把后缀名改为.php1
发现浏览器按照原文展示,并没有按照php解析这个木马,那我们就尝试别的后缀
我尝试了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进行解码,服务器前后端的校验都可以绕过