针对File Thingie从XSS到文件上传再到RCE的渗透过程

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
     ft_redirect("dir={$_REQUEST['dir']}");
    }
   } else {
        ft_set_message(t("!old could not be unzipped.", array('!old' => $file)), 'error');
    ft_redirect("dir={$_REQUEST['dir']}");
   }
在这段代码中,执行系统的unzip命令之前,在if语句里面通过函数ft_check_filetype($file)对文件类型的合法性进行了检测,函数ft_check_filetype()的具体代码如下:
function ft_check_filetype($file) {
 $type = strtolower(ft_get_ext($file));
 // Check if we are using a whitelist.
 if (FILETYPEWHITELIST != "") {
  // User wants a whitelist
  $whitelist = explode(" ", FILETYPEWHITELIST);
  if (in_array($type, $whitelist)) {
   return TRUE;
  } else {
   return FALSE;
  }
 } else {
  // Check against file blacklist.
  if (FILETYPEBLACKLIST != "") {
   $blacklist = explode(" ", FILETYPEBLACKLIST);
   if (in_array($type, $blacklist)) {
    return FALSE;
   } else {
    return TRUE;
   }
  } else {
   return TRUE;
  }
 }
}
在第二段源代码中,语句$ft["settings"]["FILETYPEWHITELIST"] = “”;将FILETYPEWHITELIST设置为空,那么函数ft_check_filetype()就会根据FILETYPEBLACKLIST来进行文件类型检测。
因此,在执行unzip命令之前的文件类型检测,无论怎么检测,文件都是合法的。由于并没有对解压之后的文件进行合法性检测,于是就导致了RCE漏洞的产生,那么就有可能将危害从Web应用层面扩展到了服务器系统层面。
修复建议
1.针对反射型XSS漏洞,服务端默认不信任任何用户的输入,可以在服务器接收终端用户输入和服务器输出到终端用户两个方向上进行严格的过滤和清洗,包括HTML 特性、JavaScript关键字、空字符、特殊字符等等;
2.使用白名单过滤机制来检测上传的文件类型的合法性;
3.在unzip解压之后,对解压后的文件进行文件类型的合法性检测,并且删除不合法的文件。
总结
本文从XSS到文件上传再到任意代码执行,详解了一次完整的渗透测试过程。渗透测试要有整体性的概念,可能涉及到多个漏洞的融合利用。相应的,考虑防御方案时,也要有纵深防御的概念,不能纠结于某个漏洞而无法自拔。
 

上一页  [1] [2] [3]