漏洞通告

根据漏洞通告了解漏洞文件在upload.cgi 并且是文件上传

漏洞分析

根据官网搭建环境

打开upload.cgi文件,环境是perl语法

漏洞点如下

文件上传句柄是通过$lightweight_fh->handle获取的

$lightweight_fh是通过 $q->upload('leases_file');获取文件内容的字段是leases_file

$filename是要打开的文件的,如果文件不存在则创建文件

继续向上分析$filename是通过 $q->param("file_name") || "";获取的,如果没有这个参数那么$filename为空

因此可以确定

  • file_name参数表示文件名
  • leases_file参数表示文件内容

流程分析

要想到达漏洞触发点需要经过三个条件判断

if ( $filename !~ /^[A-Za-z0-9-_.]+$/ ){
...退出...
}

$POST_MAX=1024 * 10000;  # 10MB max
if (($POST_MAX > 0) && ($content_length > $POST_MAX)) {
...退出...
}

if (defined $lightweight_fh) {
...漏洞触发点...
}

根据简化代码流程可以知道要想触发漏洞,要满足三个条件

  • 文件名只能是字母数字
  • 文件大小不能超过10M
  • 要有文件参数

构造payload

文件上传成功

上传webshell