1. HTML操作函数简介
当一个方法或操作允许HTML操作,如果有可能控制(甚至部分)参数,则可能在某种程度上操纵HTML,从而获得对用户界面的控制或使用传统的跨站点脚本攻击来执行JavaScript 。
数据流从源文件(可能被污染的输入数据)开始并结束到接收器(潜在危险的函数)。
在软件安全中,Sources [*]将被视为应用程序采用不可信输入数据的起点。
有两种类型的输入源:Direct和Indirect。在接下来的文章中,我们将分析直接/间接输入的各种类型,以及如何利用不正确的编程技术来恶意的JavaScript代码造成的破坏。
在软件安全方面,Sinks [*]意味着流程中的数据依赖于来源,以潜在危险的方式使用,导致机密性,完整性或可用性(CIA三元组)的损失。
这意味着如果一个函数的行为通常是安全的,但是对于受污染的输入数据可能是危险的,那么这个函数就是一个Sink。
要理解Source和Tainted Source之间的区别,请看下面的代码:
<script> var name = document.URL.indexOf("name=") + 5; <- TAINTED SOURCE document.write("Welcome " + document.URL.substring(name, document.URL.length)); <- SINK </script>
来源: document.URL
接收器: document.write()
结果: document.write(“<script> alert(document.cookie)</ script>”);
攻击将在访问以下URL时发生:
http://example.tld/page.html#name = <script> alert(document.cookie)</ script>
*词汇表 来源:来源是所有DOM属性,可以受到攻击者的影响。 接收器:接收器是可以导致或影响客户端代码执行的所有DOM属性,JavaScript函数和其他客户端实体。
1.1 HTML操作的危险JavaScript函数/属性表
下面我们报告一个表格,其中包含允许HTML操作的主要接收器,这 可能会导致JavaScript执行。
函数名称 | 浏览器 | 例 |
文件撰写 | 所有 | document.write(“<b>”+ userControlledVal +“</ b>”); |
document.writeln | 所有 | document.writeln(“<b>”+ userControlledVal +“</ b>”); |
anyElement.innerHTML | 所有 | divElem.innerHTML =“Hello”+ userControlledVal |
anyElement.outerHTML | 所有 | divElem.outerHTML =“<div> Hello”+ userControlledVal +“</ div>” |
anyElement.insertAdjacentHTML | 所有 | divElem.insertAdjacentHTML(“”,“<b>”+ userControlledVal +“</ b>”);) |
... | |
2. document.write函数和诸如innerHTML之类的属性之间的区别
document.write方法:
让我们以document.write(或document.writeln)这样的函数为例来更好地解释Sink,让我们来看看这个函数和例如属性innerHTML的区别。
正如我们所看到的,document.write以直接的方式运行,因为Sink写入(输出)由检查值的用户输入的恶意代码,实际上转到以下URL:
http://示例。 TLD / page.html中#?foo = <script> alert(document.cookie)</ script>
然后通过分析页面代码:
script> var pos = document.URL.indexOf("foo=") + 4; <- TAINTED SOURCE document.write(documemt.URL.substring(pos, document.URL.length)); <- SINK </script>
我们可以看到有问题的接口,因此,document.write将会有打印屏幕的任务作为参数插入到函数中的数据值,虽然已经通过恶意JavaScript代码的用户参数,然后函数将只无意中在有问题的DOM代码中执行写操作,那么:
alert(document.cookie)
建立浏览器端,然后是客户端,一个包含当前用户会话的cookie值的弹出窗口。
的innerHTML方法:
关于使用的innerHTML的方法,并且,这可如何由用户直接控制的对象被滥用,我们可以做一个更详细的例子,接下来就让我们下面的代码:
<div id="nm">John Doe</div> <script> var name = window.localStorage.name; <- SOURCE document.getElementById("nm").innerHTML = name; </script>
正如你所看到的,如果我们调用innerHTML方法来检索信息,即使在不是名字“John Doe”的情况下,也存在恶意的JavaScript代码。相反,我们再举一个例子:
<div id="nm">John Doe</div> <script> var pos = document.URL.indexOf("name=") + 5; var name = document.URL.substring(pos, document.URL.length); <- TAINTED document.getElementById("nm").innerHTML = name; <- SINK </script>
以下示例脚本并浏览其URL:
http://example.tld/page.html?name = <script> alert(document.cookie)</ script>
在这种情况下,浏览器会向我们返回一个窗口,告诉我们我们的JavaScript代码传递给了URL参数名,被执行了。
2.1 HTML操作漏洞易受攻击的源代码示例
在这一点上,我们可以做的是举几个例子,以便您可以看到各种现有的可能性,允许您识别并随后利用HTML操纵类型中的漏洞,然后:
- 基于DOM的跨站脚本
- 存储的基于DOM的跨站点脚本
- 其他
然后我们将看到实际的例子,下一步将解释如何通过BlueClosure BCDetect检测这些类型的漏洞以及如何利用这些漏洞。 基于DOM的跨站点脚本(DOM XSS): 所以,为了解释这种类型的漏洞,我们也可以采取上述其中一个例子,使其非常简单: 采取以下易受攻击的代码:
<script> var pos = document.URL.indexOf("foo=") + 4; document.write(document.URL.substring(pos, document.URL.length)); </script>
来源: document.URL
接收器: document.write()
结果: document.write(“<script> alert(document.cookie)</ script>”);
攻击是可能的客户端级别(这是由于#片段标识符)。
要利用这种攻击,只需转到以下URL并在“foo =”参数中指定恶意代码:
http://example.tld/page.html#foo = <script> alert(document.cookie)</ script> 存储的DOM跨站脚本(存储的DOM XSS) 我们来看一个这种类型的漏洞的例子,与第一个不同,我们可以看到,恶意代码将首先保存在HTML5的本地存储中(只有最近的浏览器支持存储功能),然后浏览下面的URL:
HTTP://example.tld/store.html?name = <img src = z onerror ='alert(document.cookie)'>
页面下方易受攻击的代码:
<script> var pos = document.URL.indexOf("name=") + 5; var name = document.URL.substring(pos, document.URL.length); decodeURI(name); window.localStorage.name = name; </script>
如上所述,“名称”保存在浏览器存储中。
现在要利用这种类型的漏洞,让我们看看如果访问(相对于上一页)以下欢迎页面URL会发生什么情况:
http://example.tld/welcome.html
使用页面的源代码:
<script> var element = document.getElementById("header"); var name = window.localStorage.name; element.innerHTML = "Hello, " + name; </script>
来源: document.URL
存储: window.localStorage.name
Sink: element.innerHTML
结果: element.innerHTML =“你好,<img src = z onerror ='alert(document.cookie)'>”;
当然,我们会有一个令人讨厌的惊喜,显示当前用户会话的cookie数据。
本文作者为Mr.Bai,转载请注明。