首先我们新建一个php的webshell文件
在这里我写了一个rabb1t.php的shell文件
内容为这个样子
然后我们把它的后缀改为img,然后我们在upload上选择这个文件进行上传并用burpsuit进行抓包
把红框处的后缀从img在改回来
上传成功后我们用蚁剑去连接shell(上传失败的原因可能是靶场中没有upload目录,我们可以手动建立一个,并且记得把权限调到最高777)
路径是ip地址加上/upload/rabb1t.php
第二题和第一题差不多,为了区别我把shell改名成了rabb2t.php
在上传时抓包,我们把框中内容改成如图所示,改成图片格式就行
然后用蚁剑去连就好了
第三题把php的后缀加入了黑名单,我们可以在php后加数字来进行绕过
我们可以直接把文件名改了也可以在红框这里去改发包里的文件名
这个shell穿进去会改名字我们找到相应的文件
就可以用蚁剑去getshell了
进去之后可以看到我们的shell文件
第四题禁止了很多后缀
所以这时候就需要尝试使用.htaccess重写文件解析绕过
然后我们将这个文件传上去
我们在把shell后缀改成图片的格式(img或者png)在传上去,.htaccess文件会将这个重新解析成webshell
我们就可以用蚁剑连接了
第五题和之前的差不多我们可以用改变后缀大小写绕过
上传之后名字会改变
第六关禁止常见后缀与大小写混用绕过
可以使用后缀加空格进行绕过
第七关禁止上传所有可以解析的后缀,这一关黑名单,没有使用deldot()过滤文件名末尾的点,
使用shell后加.绕过(对文件命名时最后一个字符为.会自动忽略)
使用webshell后加::$DATA绕过
第九关只允许上传.jpg|.png|.gif后缀的文件
这一关黑名单,最后上传路径直接使用文件名进行拼接,而且只对文件名进行
file_name = deldot(filename)
操作去除文件名末尾的点,构造后缀绕过黑名单
补充知识:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
上传rabb9t.php 然后用bp改后缀加点 空格 点(即文件名为rabb9t.php. .)
本题会去除脚本后缀,源码中将可以当成php解析的后缀都替换成空
所以我们的方法使用双写进行绕过
这一关我们看代码,可以得知是一个白名单,只允许上传’jpg’,‘png’,'gif’格式的文件。但是上传路径是可以控制的,可以使用%00进行截断
截断条件: php版本 小于5.3.4 大于此版本的修复了
我们和上一关一样在php后打截断%00,但是我们上一个是写在get头中,这个是写在载荷里面所以我们要进行编码转码,我们敲好%00然后
编码之后发送
就可以用蚁剑进行连接了
这一关是用图片+php代码,组成一个图片码进行上传,当然要想解析出来这个图片,还得有这个包含漏洞。我们看到,他已经说了,网站存在包含漏洞
我们可以cmd进行生成一个图片码,命令语句:copy 14.jpg /b + 14.php /a webshell.jpg 如图所示,我们在上传这个生成后的图片
因为上传图片马之后会被重命名图片所以下面的payload的图片名字可以在上传之后复制图片链接就可以了
构造的URL为include.php?file=upload/9720230725025046.jpg
然后用蚁剑连接
第二种方法制作一个图片码,可以直接用burp抓包在图片后面加一个php代码
刚刚我们通过把图片13和shell文件结合形成了新的rabb13t的图片码
这次我们直接用图片13上传并且抓包,在图片后加入一句话代码
(因为我这个靶场是用docker搭建的,存在着一些问题,于是我重新换了一个docker源重新搭建了一个靶场,这个版本的第15关就是原版的第14关)
我们来看这个 getimagesize函数,这个函数的意思是:会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的
所以这关还是用和14关一样的方法,生成带有php代码的图片上传,配合包含漏洞拿下此关。
我们直接用上一关所生成的图片码,和上一关操作一样
第十五关和之前两关的操作一样上传包含代码的图片就好了
第二种方法也能用
这一关对上传图片进行了判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接
二次渲染:后端重写文件内容
basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名
strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
这里我不知道怎么去找不同的地方,但是我们可以多试图片中的几个位置来避开修改的位置
这里和前几关的第二种方法一样,我们尝试直接在图片最后加上一句话代码
这里好像只有gif能传,其他的传不上去
这里我们下载一个gif上传
在这里我尝试用蚁剑去连,但是显示为空,于是我去访问这个图片
打开源码查看一下啊,因为我们是加在最后一行了,但是现在这个代码没了,所以最后这部分应该是被二次渲染所修改了
我们再试一下把一句话木马加在第一段后
传上去之后我们打开图片看一下,发现一句话木马被写上去了,于是我们尝试用蚁剑进行连接
成功
第17关我们需要看源码
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1); // 截取上传文件的后缀(不包括点)
$upload_file = UPLOAD_PATH . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file)){ // 将上传的文件移动到新位置
if(in_array($file_ext,$ext_arr)){ // 这里是进行文件后缀的判断
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file); // 删除文件
}
}else{
$msg = '上传出错!';
}
}
看到上面 第二个if和第三个if 的位置,先是将上传的文件移动到了新的位置之后再判断文件的是不是图片如果不是再删除移动的图片,逻辑上是不是有点不严谨了,说明这里就存在可以让我们绕过的地方,如果疯狂的上传和访问图片,就可能造成文件正在被访问不能删除,文件就可以暂时的保留了
所以我们首先随便上传一个webshell用burp进行抓包