JavaScript危险函数 – HTML操作

Mr.Bai 1,399 浏览 0

1. HTML操作函数简介 


当一个方法或操作允许HTML操作,如果有可能控制(甚至部分)参数,则可能在某种程度上操纵HTML,从而获得对用户界面的控制或使用传统的跨站点脚本攻击来执行JavaScript 。  

数据流从源文件(可能被污染的输入数据)开始并结束到接收器(潜在危险的函数)。

在软件安全中,Sources [*]将被视为应用程序采用不可信输入数据的起点。

有两种类型的输入源:DirectIndirect在接下来的文章中,我们将分析直接/间接输入的各种类型,以及如何利用不正确的编程技术来恶意的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数据。

发表评论 取消回复
表情 图片 链接 代码

分享
请选择语言