学习笔记三十六:文件内容检查的突破

文件内容检查包括:

  • content-type检查
  • 文件头检查
  • getimagesize()检查
  • php_exif模块检查
  • imagecreatefromjpeg二次渲染

测试流程:(前提是已经拿到一个上传点)

  • 上传一张正常的照片,验证上传功能是否正常(照片可以用.jpg或者.php等格式进行尝试上传)
  • 最好直接上传一张图片一句话马,它可以绕过content-type,文件头,getimagesize(),php_exif检查,进而成功上传
  • 针对二次渲染,寻找图片数据中不会被转换的部分,将代码插入其中(这种情况就是在你已经将含有php代码的文件成功上传了,并且文件连接也是成功的,但是无法实施执行操作,这就意味着网站可能对我们上传的文件进行了二次渲染)

content-type检查:

就是上传点会对你上传的图片的content-type值进行检查

绕过方法:

使用burp suite抓包直接修改content-type值,比如将.php格式的content-type:application/x-php  改为.jpg格式的content-type:image/jpeg

文件头检查:

将一个正常的图片放进C32Asm里并选择16进制模式,会显示学习笔记三十六:文件内容检查的突破,这就是上传点对文件头检查要检查的东西

绕过方法:

在文件头部添加gif89a(要注意的是,这样做确实可以成功绕过,但是他也会导致我们上传的文件变成.gif格式,进而导致php一句话木马无法起作用,但我们可以让它与其他漏洞结合来操作,比如结合文件包含漏洞)

gif89a
<?php
phpinfo();
?>

图片一句话

结合文件包含漏洞或者解析漏洞

getimagesize()检查和php_exif模块检查:

getimagesize()函数:

示例:

<?php
$remote_png_url = 'http://www.runoob.com/wp-content/themes/w3cschool.cc/assets/img/logodomain-green2.png';
$img_data = getimagesize($remote_png_url);
print_r($img_data );
?>

输出:

Array
(
      [0] => 290
      [1] => 69
      [2] => 3
      [3] => width="290" height="69"
      [bits] => 8
      [mime] => image/png
)

注释:

  • 索引 0 给出的是图像宽度的像素值
  • 索引 1 给出的是图像⾼度的像素值
  • 索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
  • 索引 3 给出的是⼀个宽度和⾼度的字符串,可以直接⽤于 HTML 的 <image>标签
  • 索引 bits 给出的是图像的每种颜⾊的位数,⼆进制格式
  • 索引 channels 给出的是图像的通道值,RGB 图像默认是 3
  • 索引 mime 给出的是图像的 MIME 信息,此信息可以⽤来在 HTTP Content-type 头信息中发送正确的信息,如: header("Content-type: image/jpeg");

绕过方法:

在文件头部添加gif89a

图片一句话,结合解析漏洞或文件包含漏洞

imagecreatfromjpeg二次渲染:

⼆次渲染:就是根据⽤户上传的图⽚,新⽣成⼀个图⽚,将原始图⽚删除,将新图⽚添加到数据库中。⽐如⼀些⽹ 站根据⽤户上传的头像⽣成⼤中⼩不同尺⼨的图像。

绕过方法:

寻找渲染前后不变的地⽅(可以在c32里进行比对),替换成⼀句话

上一篇:HTTP响应头


下一篇:python爬虫:爬取B站搜索内容