前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript危险函数 - HTML操作

JavaScript危险函数 - HTML操作

作者头像
奶糖味的代言
发布2018-04-12 15:27:08
2.3K0
发布2018-04-12 15:27:08
举报
文章被收录于专栏:小白安全小白安全小白安全

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数据。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. HTML操作函数简介 
    • 1.1 HTML操作的危险JavaScript函数/属性表
    • 2. document.write函数和诸如innerHTML之类的属性之间的区别
      • 2.1 HTML操作漏洞易受攻击的源代码示例
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档