upload-labs通关笔记-第15关 文件上传之getimagesize绕过(图片马)
目录
一、图片马
二、文件包含
三、文件包含与图片马
四、图片马制作方法
五、源码分析
六、制作图片马
1、创建脚本并命名为test.php
2、准备制作图片马的三类图片
3、 使用copy命令制作图片马
七、渗透实战
1、GIF图片马渗透
(1)上传gif图片马
(2)打开文件包含渗透网址
(3)文件包含利用
2、JPG图片马渗透
3、PNG图片马渗透
本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗透实战,本文讲解upload-labs靶场第15关图片马之getimagesize绕过渗透实战。
一、图片马
- 定义:图片马是一种将恶意脚本代码隐藏在图片文件中的特殊文件,它结合了图片的外观和脚本的执行能力,通常利用文件包含访问图片马来实现攻击。
- 制作原理:一般是利用图片文件格式的特性,将恶意脚本代码添加到图片文件的末尾或其他可利用的位置。由于图片文件在结构上有一些冗余部分或者对额外数据有一定的容忍度,所以可以在不影响图片正常显示的情况下嵌入恶意代码。例如,在一些图片文件格式中,文件头部分定义了图片的格式、尺寸等信息,而文件尾部可能存在一些未使用的空间,攻击者就可以将恶意脚本代码写入这些空间。
二、文件包含
文件包含风险是指 Web 应用程序在处理文件包含功能时,由于对用户输入的文件路径缺乏严格验证和过滤,导致攻击者可通过篡改参数指定恶意文件路径。攻击者能利用该文件包含来读取服务器敏感文件,或包含恶意脚本文件执行任意代码,从而获取服务器权限、篡改数据、植入后门等,严重威胁系统安全。
三、文件包含与图片马
通过文件包含访问图片马,可以使服务器执行包含恶意脚本的代码,具体步骤如下所示。
- 制作图片马:选择一张正常的图片,利用工具将恶意脚本代码嵌入到图片中。例如,对于 PHP 的图片马,可以在图片文件test15.jpg末尾添加一段 PHP 恶意代码,如<?php phpinfo();?>,这段代码会获取服务器的php版本信息。
- 上传图片马:通过网站的文件上传功能或其他途径,将制作好的图片马上传到目标服务器。如果服务器存在文件包含风险,且对上传文件的验证不严格,图片马就有可能成功上传。
- 利用文件包含访问图片马:攻击者通过构造特殊的 URL,利用文件包含让服务器包含并执行图片马中的恶意代码。例如,假设存在文件包含问题的页面是include.php,通过访问include.php?file=upload/test15.jpg,其中upload是图片马上传的目录,其中test15.jpg是图片马文件名,服务器就会执行图片马中的恶意代码,攻击者会获取服务器的php版本信息。
四、图片马制作方法
使用copy
命令制作图片马的方法如下所示,首先打开cmd命令提示符,进入到图片文件test.jpg和脚本文件info.php所在的目录,然后执行以下命令即可生成test15.jpg图片马。
copy /b test.jpg + info.php test15.jpg
/b
参数的作用是让copy
命令以二进制模式进行文件合并,这样能保证图片文件的二进制数据不被破坏。- test.jpg是正常的图片文件。
- info.php是包含恶意代码的脚本文件。
- test15.jpg是最终生成的图片马文件。
五、源码分析
打开upload-labs靶场的第15关,源码如下所示。
本小节通过getimagesize这个函数是用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息,也就是说本节通过getimagesize()函数返回的图像类型信息,来判断上传的文件是否为可以上传的文件。故而本实验中,由于需要通过获取图像的真实大小信息,故而本例中上传的图片需要包含真是的图片信息,无法像上一小节只在脚本的首部添加图片的特征,需要通过使用图片和脚本结合的方式,使用copy命令来构造图片马,这样构造出来的图片脚本是可以通过getimagesize函数成功获取到大小的。
六、制作图片马
1、创建脚本并命名为test.php
脚本内容为显示服务器php服务信息,命名为test.php,具体内容如下所示。
<?php
phpinfo();
?>
2、准备制作图片马的三类图片
准备好三类较为简单的jpg、png和gif后缀的图片(a.jpg、b.gif、c.png),以及上一步制作的test.php脚本,具体如下所示。
3、 使用copy命令制作图片马
以本实验为例,三种后缀的图片马命令如下所示,其中/b 表示一个二进制文件, + 表示将多个文件合并成一个文件, /a 表示一个ASCII文本文件。
copy a.jpg/b + test.php /a test14.jpg
copyb.gif /b + test.php /a test14.gif
copy c.png /b + test.php /a test14.png
执行copy制作图片马的效果如下所示。
于是制作好的图片马分别为test15.gif,test15.jpg,test15.png,具体如下所示。
七、渗透实战
1、GIF图片马渗透
(1)上传gif图片马
如下所示上传成功,右键获取图片URL地址。
通过复制图片地址获取到URL地址如下所示。
http://127.0.0.1/upload-labs/upload/5920211119074549.gif
(2)打开文件包含渗透网址
点击如下红框的文件包含URL链接即可进入文件包含的网页,具体如下所示。
进入文件包含主界面,url地址为:http://127.0.0.1/upload-labs/include.php,如下所示。
(3)文件包含利用
在文件包含页面访问图片马地址具体如下所示。
http://127.0.0.1/upload-labs/include.php?file=图片马的相对路径
图片马路径具体如下所示。
http://127.0.0.1/upload-labs/upload/5920211119074549.gif
所以文件包含访问图片马的URL应该如下所示。
http://127.0.0.1/upload-labs/include.php?file=upload/5920211119074549.gif
其中5920211119074549.gif是我们文件上传后的文件名,访问URL后出现大片乱码,如下所示。
向下拖动鼠标滚轮,效果如下所示,浏览器显示php的版本号7.3.30,此时证明我们成功绕过 getimagesize()的过滤信息。
2、JPG图片马渗透
由于.jpg文件.png文件的绕过与以上.gif文件绕过的方式相似,此处就不再重复列举,只提供最后的结果作为比较。test15.jpg上传界面如下所示。
test15.jpg上传成功画面如下所示。
右键获取图片马的URL地址,使用文件包含方法对其进行渗透,会显示php版本号,如下所示渗透成功。
url:http://127.0.0.1/upload-labs/include.php?file=upload/2220211119075425.jpg
3、PNG图片马渗透
test15.png图片马上传界面如下所示。
test14.png上传成功画面如下所示,可见绕过了服务器的getimagesize检查。
右键获取test15.png上传成功的URL地址,使用文件包含方法对其进行渗透,完整的利用URL地址如下所示,访问后成功显示php版本信息页面,渗透成功。
url: http://127.0.0.1/upload-labs/include.php?file=upload/2520211119075910.png