未加星标

“黑客”必学攻击之“跨站脚本攻击”

字体大小 | |
[前端(javascript) 所属分类 前端(javascript) | 发布者 店小二04 | 时间 2018 | 作者 红领巾 ] 0人收藏点击收藏

最近很多小伙伴们看了我的文章给我私信说能不能讲讲跨站脚本攻击技术,今天就以本篇文章详细讲解一下黑客常用的攻击手法"跨站脚本攻击"。

一、 什么是跨站脚本攻击?

官方定义:(Cross Site Scripting),为了不和(Cascading Style Sheets, )的缩写混淆,故将跨站脚本攻击简称为XSS。XSS是一种经常出现在web应用中的计算机安全漏洞,也是web中最主流的攻击方式。

通俗理解:XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

二、 XSS攻击带来的危害

这种漏洞(XSS)攻击通常用于发动cookie窃取、恶意软件传播(蠕虫攻击),会话劫持,恶意重定向。在这种攻击中,攻击者将恶意javascript代码注入到网站页面中,这样"受害"者的浏览器就会执行攻击者编写的恶意脚本。这种漏洞容易找到,但很难修补。

具体危害如下:

盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力 盗窃企业重要的具有商业价值的资料 非法转账 强制发送电子邮件 网站挂马 控制受害者机器向其它网站发起攻击 三、xss产生根源和攻击条件

跨站点脚本漏洞的主要原因:是程序员对用户的信任,开发人员轻松地认为用户永远不会试图执行什么出格的事情,所以他们创建应用程序,却没有使用任何额外的代码来过滤用户输入以阻止任何恶意活动。另一个原因是,这种攻击有许多变体,用制造出一种行之有效的XSS过滤器是一件比较困难的事情。但是这只是相对的,对用户输入数据的"编码"和"过滤"在任何时候都是很重要的,我们必须采取一些针对性的手段对其进行防御。

实施XSS攻击需要具备两个条件:

需要向web页面注入恶意代码; 这些恶意代码能够被浏览器成功的执行。

看一下下面这个例子:


“黑客”必学攻击之“跨站脚本攻击”

这段代码在旧版的IE8和IE8以下的版本都是可以被执行的,火狐也能执行代码,但火狐对其禁止访问DOM对象,所以在火狐下执行将会看到控制里抛出异常:document is not defined (document是没有定义的)

再来看一下面这段代码:


“黑客”必学攻击之“跨站脚本攻击”

相信很多程序员都觉得这个代码很正常,其实这个代码就存在一个反射型的XSS攻击,假如输入下面的地址:


“黑客”必学攻击之“跨站脚本攻击”

也许您会觉得把ValidateRequest设置为true或者保持默认值就能高枕无忧了,其实这种情况还可以输入下面的地址达到相同的攻击效果:

http://www.xxx.com/?id=xx" onerror="this.onload()" onload="alert(/xss/)" x="

四、XSS攻击的分类

XSS攻击可以分成两种类型:

非持久型攻击 持久型攻击

非持久型xss攻击:顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。

持久型xss攻击:持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。

也可以分成三类:

1. 反射型XSS攻击

又称为非持久性跨站点脚本攻击,它是最常见的类型的XSS。漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击)。

简单例子:

正常发送消息:http://www.test.com/message.php?send=Hello,World!

接收者将会接收信息并显示Hello,Word

非正常发送消息:http://www.test.com/message.php?send= !

接收者接收消息显示的时候将会弹出警告窗口

2. 存储型XSS攻击

又称为持久型跨站点脚本,它一般发生在XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大,因为每当用户打开页面,查看内容时脚本将自动执行。谷歌的orkut曾经就遭受到XSS。

简单例子:

从名字就可了解到存储型XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。例如留言板

留言板表单中的表单域:

<inputtype="text"name="content"value="这里是用户填写的数据">

正常操作:

用户是提交相应留言信息;将数据存储到数据库;其他用户访问留言板,应用去数据并显示。

非正常操作:

攻击者在value填写 【或者html其他标签(破坏样式。。。)、一段攻击型代码】; 将数据存储到数据库中; 其他用户取出数据显示的时候,将会执行这些攻击性代码 3. DOMBasedXSS(基于dom的跨站点脚本攻击)

基于DOM的XSS有时也称为type0XSS。当用户能够通过交互修改浏览器页面中的DOM(DocumentObjectModel)并显示在浏览器上时,就有可能产生这种漏洞,从效果上来说它也是反射型XSS。

通过修改页面的DOM节点形成的XSS,称之为DOMBasedXSS。

前提是易受攻击的网站有一个HTML页面采用不安全的方式从document.location 或document.URL 或 document.referrer获取数据(或者任何其他攻击者可以修改的对象)。

简单例子:


“黑客”必学攻击之“跨站脚本攻击”

这个例子是个欢迎页面,name是截取URL中get过来的name参数

正常操作:http://www.vulnerable.site/welcome.html?name=Joe

非正常操作:http://www.vulnerable.site/welcome.html?name=

将产生xss条件。让我们看看为什么:受害者的浏览器接收到这个链接,发送HTTP请求到www.vulnerable.site并且接受到上面的HTML页。受害者的浏览器开始解析这个HTML为DOM,DOM包含一个对象叫document,document里面有个URL属性,这个属性里填充着当前页面的URL。当解析器到达javascript代码,它会执行它并且修改你的HTML页面。倘若代码中引用了document.URL,那么,这部分字符串将会在解析时嵌入到HTML中,然后立即解析,同时,javascript代码会找到(alert(…))并且在同一个页面执行它,这就产生了xss的条件。

五、跨站脚本漏洞利用的过程

XSS的主要目标是通过把攻击者选择的JavaScript、VBScript或者其它为浏览器所接受的脚本语言注入到(放进)某些Web应用程序之中。只要攻击者可以将脚本植入有弱点的Web应用程序中的任何地方,浏览器就会认为这个脚本是来自该有弱点的Web应用程序,而非非出自攻击者之手。

这样的话,该脚本就能够在这个有弱点的Web应用程序的域中运行了,并能进行下列活动:有权读取那个有弱点的Web应用程序使用的Cookie;能够看到该有弱点的Web应用程序提供的页面的内容,甚至能将它们发送给黑客;改变有弱点的Web应用程序的外观;回调运行有弱点的Web应用程序的服务器。

大体上,跨站点脚本攻击可以分为三步进行:

HTML注入:我们将介绍把脚本注入到Web应用程序的各种可能的方法。所有HTML注入范例只是注入一个JavaScript弹出式的警告框:a_lert(1)。 干坏事。当受害者点击了一个被注入了HTML代码的页面链接时攻击者能作的各种的恶意事情。 诱捕受害者:如何强制或者诱使受害者执行恶意JavaScript代码。 HTML注入简介

将HTML和(更为重要的)脚本代码注入Web应用程序的方法简直太多了。如果某个Web应用程序的HTTP响应中"照搬"了在HTTP请求中输入的内容,例如尖括号、圆括号、句号、等号等,那么说明这个Web应用程序和域具有HTML注入漏洞,并且该漏洞十有八九可以用于XSS。

本节将为读者介绍最常见的HTML注入方法,但是无法包括所有方法,因为这些方法是在太多了。对于大多数小型至中型的网站来说,这些技术很可能仍然奏效。只要有耐心,那么您或许也能够使用其中的一种技术成功应用于一个大型Web站点。

下面我们将分门别类的介绍各种注入方法。

1. 传统的反射式和存储式HTML注入

传统的XSS攻击是一种反射式的HTML注入攻击,借此,一个Web应用程序接受在HTTP请求中的用户输入。该Web应用程序会返回一个HTTP响应,其主体中将包含原封不动的用户输入。如果该服务器的响应跟用户的原始输入完全一致,那么这些用户输入就会被浏览器当作有效的HTML、VBScript或者JavaScript进行解释。考虑下列的服务器端php代码:

展示了这段代码放置到http://publicpages.daxue.edu/~someuser/MyPhp.php上后,客户端看到的页面内容。


“黑客”必学攻击之“跨站脚本攻击”

一个简单的PHP脚本,用以接收用户输入(MyPhp.php)

当用户点击"提交查询"按钮时,就会生成下列GET请求:

http://public-pages.daxue.edu/~someuser/MyPhp.php?input=hahaha

这个PHP应用程序看到用户输入的"hahaha"后,将响应一个页面,如图所示。


“黑客”必学攻击之“跨站脚本攻击”

用户输入"hahaha"后MyPhp.php回复的响应

下面显示的是上图中看到的页面的HTML 源代码,为醒目起见用户输入的内容这里以蓝色字体显示。

您输入的内容为: 'hahaha'.

注意,实际上这里用户可以输入任何东西,例如〈 script 〉 a_lert( 1 )〈 / script 〉、〈 body onload = a_lert( 1 ) 〉、〈 img src = x onerror = a_lert( 1 ) 〉 或别的东西来把JavaScript代码注入到该页面。如果输入 的话,将向服务器发送下列GET请求:

http://publicpages.daxue.edu/~someuser/MyPhp.php?input=

如前所述,这个PHP应用程序只是把用户输入放到返回的响应页面中。这时候浏览器会把这些用户输入的内容当作JavaScript指令,同时认为该脚本来自服务器,这可真是应了那句老话"拿着鸡毛当令箭"了,所以浏览器就会执行这些JavaScript代码。下图展示了用户看到的样子。


“黑客”必学攻击之“跨站脚本攻击”

上图 用户输入" "后MyPhp.php回复的响应

[NextPage]上图中显示的页面的源代码如下所示,其中用户输入用蓝色字体表示。

您输入的内容为: ' '.

这是将 注入http://public-pages.daxue.edu/~someuser/MyPhp.php得到的结果。这个例子是一种典型的反射式的HTML注入,因为用户在HTTP请求中发送JavaScript代码,同时Web应用程序立即响应(反射回)一个完全相同的JavaScript代码。只要用户单击了下列链接,这个脚本就会执行:

http://publicpages.daxue.edu/~someuser/MyPhp.php?input=

从攻击者的角度来看,利用注入的ML代码让恶意的web页面完成单击或者指定次数的点击是非常重要的。假设前面的PHP应用程序只接受POST请求,而不接受GET,如下所示:

在这种情况下,攻击者无法像上面的GET请求那样直接通过诱骗受害者点击一个链接来注入HTML代码;现在,他们必须采取一些额外的步骤。为此,攻击者可以创建下列HTML页面:

当用户单击了指向上述HTML页面的链接时,就会对http://public-pages.daxue.edu/~someuser/MyPhp.php进行HTML注入。当然,攻击者也能利用HTML注入干别的坏事,而不仅仅象征性地调用一个JavaScript的弹出窗口。

"第二步:做坏事"部分将解释攻击者除了弹出一个窗口外还能做些什么。

存储式HTML注入跟反射式HTML注入非常相似,唯一区别在于攻击者将脚本植入Web应用程序后,这些脚本会被Web应用程序存储到一个可以检索的地方。例如,对于允许用户张贴和阅读消息的网络论坛,攻击者可以在张贴消息时注入HTML代码,然后其它用户阅读这则含有脚本的消息时,其中的脚本就会执行。

2. 定位存储式和反射式HTML注入点

为了寻找存储式和反射式HTML注入点,可以尝试在所有表单输入以及GET或者POST请求的所有参数中注入脚本。我们要假设参数/值对中的值都可能有漏洞。甚至尝试在新生成的参数中注入HTML代码,如下所示:

〈 script 〉 a_lert ( ' parameter ' )= 不起作用,因为这些测试字符串并不出现在响应的HTML主体区。举例来说,假如向http://search.engine.com/search?p= 发送的这个请求返回的响应中,其预填充表单字段内是我们的HTML注入字符串,如:

遗憾的是,脚本标签会被作为用于表单输入字段的字符串,所以无法执行。相反,尝试http://search.engine.com/search?p="> 的话,会得到如下所示的HTML应答:

〈forminput='text'name='p'value='〈

那么保不住攻击者可以注入下列内容:

〈/title〉〈script〉a_lert(1)〈/script〉

这样一来就摆脱了title标签。USERINPUT3被放在一个式样标签中,任何人都可以在IE中设置USERINPUT3成下面的样子:

black;background:url('javascript:a_lert(1)');

于是他就能够在Firefox使用它了:

1:(a_lert(1))

同样的,有时候用户输入会作为其它的标签的一部分出现在式样参数中,如下所示:

如果您可以将USERINPUT3设为下面的值,那么就能在IE中运行JavaScript了:

javascript:a_lert(1)

或者对于Visual Basic爱好者,可以这样使用:

vbscript:MsgBox(1)

Firefox不接受带有JavaScript:协议处理程序的background:url()。然而,Firefox允许JavaScript作为表达式来执行,在Firefox中将USERINPUT3A设为下列值:

);1:(a_lert(1)

USERINPUT4可以直接利用,只要将USERPINUT4设为:

';a_lert(1);

USERINPUT5被深深嵌入到JavaScript内部。为了插入(确保会执行的)a_lert(1)函数,您必须把a_lert(1)放到所有代码块之外,并保证JavaScript代码的前前后后都是合法的,如下所示:

')){}a_lert(1);if(0) A_lert(1)之前的文本完成了原先的if语句,因此能确

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

代码区博客精选文章
分页:12
转载请注明
本文标题:“黑客”必学攻击之“跨站脚本攻击”
本站链接:https://www.codesec.net/view/620985.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 前端(javascript) | 评论(0) | 阅读(43)