<A HREF="http://safe.it168.com">IT168安全频道</A>javascript
而XSS的原理也就是往HTML中注入脚本,HTML指定了脚本标记<script></script>.在没有过滤字符的状况下,只须要保持完整无错的脚本标记便可触发XSS,假如咱们在某个资料表单提交内容,表单提交内容就是某个标记属性所赋的值,咱们能够构造以下值来闭和标记来构造完整无错的脚本标记,html
"><script>alert(XSS);</script><"java
结果造成了<A HREF=""><script>alert(XSS);</script> <"">茄子宝的博客在这里</A>这样一个标记,:)这里和SQL注入很像!程序员
测试闭和表单赋值所在的标记,造成完整无错的脚本标记可触发XSS,可是没有脚本标记怎么触发XSS呢?呵呵,咱们只好利用其余标记了,假如要在网页里显示一张图片,那么就要使用一个<img>标记,示例以下:浏览器
img标记并非真正地把图片给加入到Html文档把二者合二为一,而是经过src属性赋值。那么浏览器的任务就是解释这个img标记,访问src属性所赋的值中的URL地址并输出图片。问题来了!浏览器会不会检测src属性所赋的值呢?答案是否!那么咱们就能够在这里大作文章了,接触过javascript的同志应该知道,javascript有一个URL伪协议,可使用“javascript:”这种协议说明符加上任意的javascript代码,当浏览器装载这样的URL时,便会执行其中的代码.因而咱们就得出了一个经典的XSS示例:安全
![]() |
固然并非全部标记的属性都能用,细心的你应该发现标记的属性在访问文件才触发的XSS,这里我就再也不深刻,由于离开标记的属性还有事件能帮助咱们触发XSS.那什么是事件呢?只有达到某个条件才会引起事件,正巧img标记有一个能够利用的onerror()事件,当img标记内含有一个onerror()事件而正好图片没有正常输出便会触发这个事件,而事件中能够加入任意的脚本代码,其中的代码也会执行.如今咱们又获得了另一个经典的XSS示例:xss
<img src=" http://xss.jpg" onerror=alert(XSS)>如图二函数
![]() |
综合这一部分,咱们知道XSS的触发条件包括:完整无错的脚本标记,访问文件的标记属性和触发事件测试
2、XSS转码引起的过滤问题网站
有攻就有防,网站程序员确定不会听任你们利用XSS,因此他们常会过滤相似javascript的关键字符,让你们构造不了本身的XSS,我这里就捡两个被忽略惯了的字符来讲,它们是"&"和"".首先来讲说"&"字符,玩过SQL注入的都知道,注入的语句能够转成16进制再赋给一个变量运行,XSS的转码和这个还真有殊途同归之妙,缘由是咱们的IE浏览器默认采用的是UNICODE编码,HTML编码能够用&#ASCII方式来写,这种XSS转码支持10进制和16进制,SQL注入转码是将16进制字符串赋给一个变量,而XSS转码则是针对属性所赋的值,下面我就拿<img src="javascript:alert(XSS);">示例:
<img src="javascript:alert
('XSS');"> //10进制转码 如图三
![]() |
<img src="javascript:aler&
#x74('XSS');"> //16进制转码。
这个&#分隔符还能够继续加0变成“j” ,“j” ,“j” ,“j”等形式。
而这个""字符却暴露了一个严重的XSS 0DAY漏洞,这个漏洞和CSS(Cascading Style Sheets)层叠样式表有很大的关联,下面我就来看看这个漏洞,先举个javascript的eval 函数的例子,官方是这样定义这个函数:
eval(codeString),必选项 codestring 参数是包含有效 JScript 代码的字符串值。这个字符串将由 JScript 分析器进行分析和执行。
咱们的JavaScript中的""字符是转义字符,因此可使用""链接16进制字符串运行代码
<SCRIPT LANGUAGE="JavaScript">
eval("x6ax61x76x61x73x63x72x69x70x74x3ax61x6cx65x72x74x28x22x58x53x53x22x29")
</SCRIPT>恐怖的是样式表也支持分析和解释""链接的16进制字符串形式,浏览器能正常解释。下面咱们来作个实验: 写一个指定某图片为网页背景的CSS标记:
<html>
<body>
<style>
BODY { background: url(http://up.2cto.com/Article/201103/20110330123053137.gif) }
</style>
<body>
<html>
保存为HTM,浏览器打开显示正常。
转换background属性值为""链接的16进制字符串形式,浏览器打开一样显示正常。
<html>
<body>
<style>
BODY { background: 75726c28687474703a2f2f3132372e302e302e312f7873732e67696629 }
</style>
<body>
<html>
在文章第一部分我已经说过XSS的触发条件包括访问文件的标记属性,所以咱们不难构造出
<img STYLE="background-image: url(javascript:alert(XSS))">
这样的XSS语句。有了实验的结果,咱们又能对CSS样式表的标记进行XSS转码,浏览器将帮咱们解释标记内容,XSS语句示例:
<img STYLE="background-image: 75726c286a6176617363726970743a616c6572742827585353272929"> 看图四
![]() |