网站地图    收藏   

主页 > 后端 > 网站安全 >

Xss Exploits and Defense翻译(1-3) - 网站安全 - 自学ph

来源:自学PHP网    时间:2015-04-17 13:03 作者: 阅读:

[导读] SYNGRESS的《Xss Exploits and Defense》这本书还不错,但是没有找到中文版,在学习过程中就大概翻译了一下。XSS攻击和防御第一章:跨站脚本基本原理本章主要内容:l 跨站脚本的历史l Web应...

SYNGRESS的《Xss Exploits and Defense》这本书还不错,但是没有找到中文版,在学习过程中就大概翻译了一下。
 
 
XSS攻击和防御
 
第一章:跨站脚本基本原理
本章主要内容:
 
l 跨站脚本的历史
 
l Web应用程序安全
 
l XML和AJAX介绍
 
 
总结
 
 
快速回顾
 
 
常见问答
 
绪论
跨站点脚本漏洞可以追溯到1996年在世界初期万维网(WEB)。一时间,当电子商务开始起飞,就成了网景、雅虎和那些令人生厌的闪烁的标记(HTML标记)的泡沫时代。当成千上万的网页正在建设中,充斥着用超文本标记语言(HTML)结构建立的“酷”网站。Javascript程序语言应运而生,跨站脚本的一个未知预兆,永远改变了web应用程序安全的景观。Javascript使得web开发人员可以创建交互式的网页效果包括图像翻转,浮动菜单和弹出式窗口。对于现在不起眼的异步Javascript和XML(AJAX)应用程序标准,黑客很快发现一个新的未开发世界的可能性。
 
黑客们发现当不知情的用户访问他们的网页,他们可以在同一个浏览器窗口中强行装入一个HTML框架的任何网站(银行,拍卖,商店,web邮件等等)。
 
然后使用Javascript,他们可以跨越两个网站的边界,从一个页面访问另一个页面。他们可以窃取用户输入在HTML表单里的用户名和密码,盗取cookie和威胁到任何在屏幕上出现的机密信息。媒体将这些问题报道为浏览器漏洞。网景通讯,占主导地位的浏览器供应商,为了对应这种情况,实现了“同源策略”,限制Javascript不能从一个网页到另一个网页获取数据。浏览器黑客将这个作为挑战,然后开始挖掘各种聪明的方法来规避这个限制。
 
1999年12月,David Ross在微软的Internet Explorer安全响应工作。他受到在当时发现Internet explorer's 安全模型威胁的Georgi Gununski的启发。他指出web内容会暴露“脚本注入”有效地绕过Georgi的Internet Explorer代码缺陷,但是这个错误似乎存在服务端而不是客户端代码。David在微软内部文档中将这个描述为“脚本注入”。这个文档描述的问题,是它如何利用,如何攻击可以持续使用cookie,XSS如何工作,和输入/输出过滤解决方法。

 
最终这个概念被CERT机构所共享。目的就在于让公众也知道,让这个问题以负责的方式被揭露,然后网站可以被修复,不仅仅是微软,而是整个行业。跨组织团队在一月中旬的讨论最终从以下名称中选择了“Cross Site Scripting”这个名称:
 
n Unauthorized Site Scripting
 
n Unofficial Site Scripting
 
n Uniform Resource Locator (URL) Parameter Script Insertion
 
n Cross-site Scripting
 
n Synthesized Scripting
 
n Fraudulent Scripting
 
 
在2000年1月25日,微软和CERT,很多厂商(例如:Apache等)还有一些感兴趣的组织在Bellevue的一个酒店讨论这个XSS这个概念。
 
David在Ivan Brugiolo,John Coates和Michael Roe的帮助下,重写了那份微软内部文档,让它成为适合公众的版本。在CERT的协调下,微软在2000年2月2日发布了这个文档和其他材料。在过去几年里,在Microsoft.com网站这份文档有时候被移除了,但是不会在互联网消失。现在可以在下面网站被找到:
 
http://ha.ckers.org/cross-site-scripting.html 。
 
 
同个时间,黑客在可以提交HTML/Javascript的HTML页面,留言簿,邮件服务商提交脚本来影响用户。这就是有时候被叫做HTML注入的来源。黑客创建一个JavaScript的恶意软件(malware)的基本形式,他们将HTML表单提交改变屏幕上的名字,欺骗贬义的消息,窃取cookie,调整网页的颜色,宣告病毒推出的警告,和其他隐约恶意的数字恶作剧。不久后,出现另一种攻击的变种。利用社会工程学,诱导用户点击带有恶意代码的链接可以达到跟HTML注入一样的结果。Web用户除了禁止Javascript的运行,没有其他防御的手段。
 
历年来,最早为认为是跨站脚本开始变成浏览器的一个简单未知名漏洞。HTML注入和恶意链接就是现在指的跨站脚本的变种,分别是持久性和非持久性的跨站脚本。不幸的是,这就是很多人被混乱的术语搞糊涂的一个重要原因。更糟糕的是,“CSS”的缩写和另一个新生的浏览器技术“Cascading Style Sheets”的缩写一样,所以经常混淆。终于在2000年初,一个聪明的人建议将CSS的缩写改为XSS来避免混淆。最后,XSS的名称被定下来。很多新的白皮书和大量的漏洞公告描述跨站脚本的影响充斥着网络。但是很少人去关注。
 
到2005年之前,绝大多数的安全专家和开发者很少关注XSS漏洞。他们关注的是缓冲区溢出,僵尸网络,病毒,蠕虫,间谍软件等等。以此同时,全球每月有百万的新的web服务器开始用SSL保护他们的服务器。大多数人认为可以导致XSS漏洞的Javascript是一个玩具变成语言。有一些论调,”它不能入侵操作系统或者入侵数据库,我为什么要在乎呢?就点击一个链接或者浏览一个网页会能多危险呢?“。2005年10月,我们得到了答案。一夜之间,Samy蠕虫病毒,第一个严重的XSS蠕虫将流行的社交网站MySpace搞摊了。这个攻击脚本的有效载荷相对良性,Samy蠕虫从一个单一的MySpace用户的个人资料页传播到另一个,最后在24小时内感染了超过一百万的用户。突然间,整个安全界清醒了,开始了爆炸式的研究Javascript的恶意脚本。
 
短短几个月后,在2006年年初,JavaScript的端口扫描器,局域网黑客,击键记录器,木马,浏览器历史记录盗取到达了一个似乎不会停止的景象。数百个XSS漏洞被大网站修复关闭,同时罪犯(黑客或者攻击者)开始结合钓鱼欺骗实施更有效的攻击。令人吃惊的是,因为根据白帽安全组织的统计,超过70%的网站是脆弱的,存在漏洞的。CVE组织声称说XSS攻击已经超过缓冲区溢出,成为发现最多的漏洞。可以说,XSS漏洞代表作为信息安全和在线商业所面临的最潜在的破坏性漏洞。现今,当人们被问到是否听说过XSS,几乎每个人都会举手表示听说过。
WEB应用安全
Web互联网上有超过800万网民,100万个网站,每天交易在网上交易数十亿美元。国际经济依赖于网络已经成为一种全球性的现象,因为Web邮件,留言板,聊天室,拍卖,购物,新闻,银行,以及其他基于网络的软件已经成为数字化生活的一部分。 今天,用户可以通过给出姓名,地址,社会安全号码,信用卡信息,电话号码,年薪,出生日期,有时甚至是自己喜欢的颜色或他们的幼儿园老师的名字来接收财务报表,税务,记录,或当日交易的股票。 我之前有提过超过80%的网站对这些数据的处理存在严重的安全风险?即使是最安全的系统也会受到最新安全威胁的困扰。
 
 
 
有收集个人信息和私人信息的组织有责任保护它不受窥探。企业荣誉和个人身份危在旦夕。Web应用程序安全一直以来是至关重要的,我们需要考虑得更多。我们正处在身份泄漏,脚本小子的影响和信息被泄漏的烦恼中。新网站推出了电网控制,操作水坝,填写处方,多数美国企业的工资管理,运行企业网络,管理等真正的关键功能。想象一下,如果这些系统遭受恶意代码的威胁意味着什么。很难想象,更重要的信息安全领域。Web应用程序的漏洞已经变成最简单,最直接,或者可以说是最容易被利用来实施攻击的。
 
 
 
 
 
直到最近,每个人还认为防火墙,SSL,入侵检测系统,网络扫描仪和密码是网络安全的答案。安全专家借用一个最基本的军事理论来保护你所拥有的,就是设立一个周长。这个意思就是允许好人进来和把坏人拦截在外面。大部分这个策略是有效的,直到web和电子商务永远改变了这个策略。电子商务要求防火墙放行80端口和443端口的流量。本质上就意味着你不得不将你暴露在整个互联网中。似乎一夜之间整个移动互联网从薄壁网络到全球性商业集市。周长和安全管理员发现他们已经没有任何方法来应对web应用程序的安全。
 
 
 
 
Web开发者现在在创建跟web商业相关的应用程序就会考虑到安全性。基础性软件的设计理念不得不改变。这种转变之前,平均款软件使用的用户数量相对较少。开放者现在创建的软件在整个互联网可接入的web服务器上为任何人在任何地点提供服务。他们的软件交付的范围和幅度已成倍增加,并在这样做,安全问题也加剧。现在全球数百万的用户直接跟服务器打交道,很多人可能是恶意的。新的类型例如跨站脚本,数据库查询注入,和一大堆其他新的基于web的攻击开始不得不被理解和处理。
 
 
 
 
web应用程序安全是一个大的话题围绕很多原则,技术和设计概念。通常,我们关注的是如图1.1 从web 服务器开始以上的层次。这个包括应用服务器例如:JBoss,IBM WebSphere,BEA WebLogic和其他数千种。然后我们进入商业和开源web应用程序例如PHP Nuke,微软OWA,和SAP。最后是开发者他们自定义的内部程序。这是web应用安全的整个结构。
 
  
图1-1 漏洞栈(www.2cto.com:作者处缺图)
 
 
 
 
Web应用开发者必须理解和知道如何防御的最大威胁之一就是XSS攻击。尽管XSS在web应用安全领域是相对小的一块内容,但是对互联网用户来,他可能是最危险的。Web应用的一个简单bug可能导致攻击者盗取暑假,接管用户的浏览体验等。
 
 
 
具有讽刺意味的是,具有讽刺意味的是,很多人不理解XSS漏洞的危险,以及他们如何可以经常被用来攻击受害者。这本书主要目的是通过一系列讨论,例子和阐述XSS能在现实生活中造成的威胁和影响来教育读者。
XML和AJAX介绍
我们假定阅读这本书的读者是有一定的Javascript和html基础的。这些技术是基于已经形成的多年的标准和协议,网络上有不计其数的关于他们的原理和这些技术的利用的信息。然而对于AJAX和XML新技术,我们觉得在这里做个基本的概述是一个不错的主意。
 
AJAX长期被认为是跟XML有很紧密的联系,因为XML的缩写就成了AJAX名称的一部分。也并不总是这样。AJAX是指某段时间被开发实践出来的一种新方法的缩写。它的基本含义,AJAX是一系列技术用来提高web应用程序的用户体验,提供更好的可用性,和加快访问的速度。
 
AJAX的核心技术在2005年前主流web开发者提出前就一直存在。这个核心技术在今天广泛应用是由微软的在发展各种远程脚本技术开发出来的。这些技术被定义为AJAX比传统的远程组件(在DHTML程序实践中定义的)例如:IFRAME和LAYER元素要好得多。
 
AJAX中最基本和必要的元素就是XMLHttpRequest Javascript对象。这个对象提供一个机制使得提交数据到服务器不需要重新页面,而可以直接载入。这个对象对于不同浏览器的使用是不一样的。XMLHttpRequest对象是简单直观的。下面这个例子就阐述如何请求和使用的:
 
// instantiate new XMLHttpRequest
 
var request = new XMLHttpRequest;
 
// handle request result
 
request.onreadystatechange = function () {
 
if (request.readyState == 4) {
 
//do something with the content
 
alert(request.responseText);
 
}
 
};
 
// open a request to /service.php
 
request.open('GET', '/service.php', false);
 
// send the request
 
request.send(null);
 
 
 
 
因为很多原因,XMLHttpRequest对象并不能使得在所有浏览器都用同一种实现方式。这个是基于AJAX是一个新技术,尽管很快被制定标准,但是我们仍然需要解决浏览器兼容性的问题。这些问题通常是通过AJAX库里被解决,但是我们作为安全研究者,经常需要使用最基础的做法。
 
如上所述,XMLHttpRequest对象因浏览器版本不一样而有区别。以微软浏览器为例,要求用ActiveXObject(’Msxml.XMLHTTP‘)甚至AcitiveXobject
 
(’Microsoft.XMLHTTP‘)来产生跟标准XMLHttpRequest对象类似的对象。其他浏览器也有不同方法来实现。为了兼容所有浏览器,我们用下面定义函数:
 
var xhr = null;
 
if (window.XMLHttpRequest) {
 
    xhr = new XMLHttpRequest();
 
} else if (window.createRequest) {
 
    xhr = window.createRequest();
 
} else if (window.ActiveXObject) {
 
try {
 
    xhr = new ActiveXObject('Msxml2.XMLHTTP');
 
} catch (e) {
 
try {
 
xhr = new ActiveXObject('Microsoft.XMLHTTP');
 
} catch (e) {}
 
}
 
}
 
return xhr;
 
};
 
// make new XMLHttpRequest object
 
var xhr = getXHR();
 
 
 
 
XMLHttpRequest有很多的方法和属性,汇总在下表:
 
 
 
 
 
注意response Text和responseXML属性的区别。他们都是返回服务器返回的文本,但是他们的功能有很大的不同。
 
responseText用在返回文本,HTML页面,二进制和除了XML外的任何内容。处理XML的时候,就必须要使用responseXML属性,它会把返回的内容解析为DOM对象。
 
我们已经说明了responsetText的使用方法,现在我们来看看responseXML的使用。在我们给出例子之前,先解释一下XML的目的。
 
XML被设计为标记语义而非结构,就像HTML。XML是一个自己的小语言,没有任何边界。其他标准跟XML相关是XPATH,XSLT,XML XSD,Xlink,Xforms,SOAP,XMLRPC等等。我们并不打算介绍他们全部,这本书只是快速概述一下,你可以在www.w3c.org学习。
 
尽管XML和HTML不一样,但是他们都是由元素和标记组成。XML和HTML元素是有很高的结构化。他们可以被表示为一个DOM结构。实际上,DOM是www组织定义的一组规范。它定义XML结构如何被创建和那些方法和属性是必须的。同样,HTML也可以被解析为一个DOM树。
 
DOM函数中最经常用的一个是getElementsByTagName,,用来返回包含元素的数组。另外一个常用函数是getElementById,用来返回基于标识的简单元素。例如,利用Javascript可以很容易提取所有的<p>元素并用“hello world!”替代他们里面的内容。例子如下:
 
// get a list of all <p> element
 
var p = document.getElementsByTagName('p');
 
// iterate over the list
 
for (var i = 0; i < p.length; i++) {
 
// set the text of each <p> to 'Hello World!';
 
p[i].innerHTML = 'Hello World!';
 
}
 
 
 
我们可以从XMLHttpRequest对象返回的responseXML 属性通过简单的方法提取。例如:
 
function getXHR () {
 
var xhr = null;
 
if (window.XMLHttpRequest) {
 
xhr = new XMLHttpRequest();
 
} else if (window.createRequest) {
 
xhr = window.createRequest();
 
} else if (window.ActiveXObject) {
 
try {
 
xhr = new ActiveXObject('Msxml2.XMLHTTP');
 
} catch (e) {
 
try {
 
xhr = new ActiveXObject('Microsoft.XMLHT
 
} catch (e) {}
 
}
 
}
 
return xhr;
 
};
 
// make new XMLHttpRequest object
 
var request = getXHR();
 
// handle request result
 
request.onreadystatechange = function () {
 
if (request.readyState == 4) {
 
//do something with the content but in XML
 
alert(request.responseXML.getElementById('message'));
 
}
 
};
 
// open a request to /service.xml.php
 
request.open('GET', '/service.xml.php', false);
 
// send the request
 
request.send(null);
 
If the server response contains the following in the body:
 
<messageForYou>
 
<overHere id="message">Hello World!</overHere>
 
</messageForYou>
 
 
 
 
 
浏览器就会在弹出窗口中显示“hello world!”。
 
理解XML和AJAX的基本概念是很重要的,因为他们正在变成Internet的完整一部分。同样理解这些技术会对传统web应用安全测试产生的影响也是很重要的
 
 
摘自wzhj132 的BLOG

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论