Upload-labs文件上传漏洞(getimagesize函数)——Pass14

桃扇骨 2023-03-02 13:13 131阅读 0赞

0×00 题目概述

与13差不多

20200729143144592.png

但是不是读取字节,而是使用函数检查

20200729143215487.png

#

0×01 源代码

  1. function isImage($filename){
  2. $types = '.jpeg|.png|.gif';
  3. if(file_exists($filename)){
  4. $info = getimagesize($filename);
  5. $ext = image_type_to_extension($info[2]);
  6. if(stripos($types,$ext)>=0){
  7. return $ext;
  8. }else{
  9. return false;
  10. }
  11. }else{
  12. return false;
  13. }
  14. }
  15. $is_upload = false;
  16. $msg = null;
  17. if(isset($_POST['submit'])){
  18. $temp_file = $_FILES['upload_file']['tmp_name'];
  19. $res = isImage($temp_file);
  20. if(!$res){
  21. $msg = "文件未知,上传失败!";
  22. }else{
  23. $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
  24. if(move_uploaded_file($temp_file,$img_path)){
  25. $is_upload = true;
  26. } else {
  27. $msg = "上传出错!";
  28. }
  29. }
  30. }

编写了isImage()函数

0×02 做题步骤

好像只要上传图片马就可以了

20200729144900862.png

依旧可过

步骤与Pass13相同

20200729145744883.png

#

0×03 关于getimagesize()函数

getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。函数成功返回的就是一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

上一题我们利用自己写的文件包含漏洞页面脚本来检验webshell是否能被解析,这一题就自己写包含getimagesize()的php脚本,用来读取本地的图片,然后我们来看看这个函数的解析机理是怎么样的

代码如下

  1. <?php
  2. $local_png ='./1.jpeg';
  3. $img_data = getimagesize($local_png);
  4. var_dump($img_data );
  5. ?>
  6. /*
  7. 测试函数,用getimagesize()函数对本地图片进行检查,然后将检查结果的数组打印出来
  8. */

记住,要读取什么图片就在$local_png=后面的参数中写入文件的名字

然后将此文件命名为getimagesize.php,放入upload文件夹下

然后输入url

http://127.0.0.1/upload-labs/upload/getimagesize.php

即可看到

20200729152008525.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 的 标签

索引 bits 给出的是图像的每种颜色的位数,二进制格式

索引 channels 给出的是图像的通道值,RGB 图像默认是 3

索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如: header(“Content-type: image/jpeg”);

在本次测试中并未出现索引channels,此处只做了解。

然后再看回本地源代码,发现只检查了索引2

20200729152220710.png

也就是图像的类型,所以和上一题大同小异,上传图片马即可通过。

参考链接:

https://www.zhaosimeng.cn/writeup/70.html

发表评论

表情:
评论列表 (有 0 条评论,131人围观)

还没有评论,来说两句吧...

相关阅读