pass-01
传php文件发现不行,提示来自前端即浏览器发出。
针对前端验证
前端验证属于是在客户端进行验证。因此,我们可以对浏览器做手脚
方法一:
禁止浏览器js功能
然后传就行了
方法二
我们找一个中转上传
由于是前端验证,js代码f12就能看到
我们把代码全部复制
在本地网站开一个php,然后写入复制的代码。将程序指向靶场
然后访问程序就行
正常测试的时候,我们需要得到文件路径才能getshell
dirsearch扫一下就行
pass-2
咱们直接开始后端验证了
传图片他说类型错了,抓个包,改类型就欧克
pass-3
提示后缀名有问题,我们就把filename改一下
这里有一个细节,文件名被后端修改了,我们可以通过前端代码看到。不知道文件名是不能get shell 的
pass4
结合2和3就行
pass5
利用系统解析漏洞 .user.ini
意思是ini所在的文件夹下名为1.jpg的文件全部被文件夹下的PHP文件包含。
之前以为和.htaccess一样,然后就直接访问jpg。然后就gg了
pass6
应该是源代码没有strtolower
pass7
应该是源代码没有删除首尾空格
pass8
没有删去末尾的. 即缺少deldot
pass9
没有替换掉::$DATA
pass10
功能基本齐全,但是没有多次过滤。我们可以1.php. .绕过
pass11
双写后缀名绕过
pass12
00截断
pass13
同样的00截断,这次在post数据上,所以要url解码
pass14
这一关只对文件头进行检查。我们可以传图片码,也可以在上传的php加上可以通过验证的文件头
pass15
这次使用了getimagesize()函数。使用图片码肯定方便些
pass16
同样是图片码
pass17
还是图片码
pass18
利用二次渲染以及条件竞争
由于第一次上传没有验证,我们可以抓第一次上传的包,利用bp反复上传
另一边再用bp反复接受,这样就完成了对靶机的上传。
不过在实战的情况下,我们是很难在这种不稳定的情况下连接后门的
所以一句话木马可以这样写
<?php fputs(fopen("8848.php", "w"), '<?php @eval($_POST["shell"]);?>'); ?>
pass19
require_once()
观察代码可以知道,会先接收文件(会进行白名单过滤),然后再对文件改名。
很多人说这是条件竞争。我并不觉得。实际上,改名对我们的影响并不大。(是可以抓包知道路径和更改之后的名字的)因为是白名单过滤,我们可以传图片码,然后寻找解析漏洞或者文件包含漏洞。扫一下目录,我们不难发现有include.php
之后文件包含一下就行了。
pass20
跟前面一样,00截断就行
pass21
说真的,这关要是实战遇到的黑盒,我会直接跑路。用数组谁拟🐎能想到的。
三重检查
第一重很简单的mime检查 ,抓包改i类型就OK
后面就开始诡异。它把你上传的文件名改成数组。拆开来检验后缀,然后再合起来作为新名字
方法就是用数组绕过。这时候用count()算出来的长度是2不是3。这一点我猜测是第二个单元数值都没有初始化,可能计算的时候直接就视为没有这个单元。