JavaScript危险函数 - HTML操作

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逍遥剑客的游戏开发

Nebula3 Render Application Wizard

16730
来自专栏Google Dart

AngularDart Material Design 选项树 顶

如果SelectionOptions实现Parent接口,则为Parent.hasChildren设置的每个选项显示一个handle,并且切换handle将从P...

20120
来自专栏Java技术分享

第九章:Shiro的Web——深入浅出学Shiro细粒度权限开发框架

Shiro可以和普通web集成的,但考虑到现在的应用基本都会使用spring,所以就不去讲最基本的web集成了。跟Spring集成的方式前面已经讲过了。 在We...

24090
来自专栏Ken的杂谈

.NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧

启动调试后,程序启动,并会停留在第一个断点这一行。且这行的代码并未执行。 VS Code会自动唤出Debug工作区,本文将逐步介绍常用功能。

22710
来自专栏数据结构笔记

Django搭建博客(四):渲染前数据的处理

一个简单得方法就是不直接在模板里使用 date属性,而是使用date属性的year 、month 和 day属性来拼凑我们所需的日期格式。

11220
来自专栏从零开始学 Web 前端

从零开始学 Web 之 Ajax(七)跨域

跨域这个概念来自一个叫 “同源策略” 的东西。同源策略是浏览器上为了安全考虑实施的非常重要的安全机制。

15640
来自专栏葡萄城控件技术团队

Webpack4教程 - 第二部分,使用loader处理scss,图片以及转换JS

今天继续我们的Webpack 4入门教程。在介绍了Webpack的基本概念之后,是时候更深入一点了。这次我们会涉及Webpack中非常强大的一个东西:loade...

19110
来自专栏ShaoYL

XCode的debug断点调试

39070
来自专栏河湾欢儿的专栏

sass

我们大家都知道html、css不属于编程语言属于标记语言,所以很难像js一样定义变量、编写方法实现模块化,而目前的css编写模式中都是定义一些公共样式类名,那一...

35710
来自专栏张戈的专栏

利用腾讯云 COS 云对象存储定时远程备份网站

一、优点分析 内网传输:和阿里云 OSS 一样,腾讯云 COS 同样支持内网和外网文件传输,对于腾讯云服务器,使用内网传输绝对是最快、最稳定的备份方案! 免费...

2.9K100

扫码关注云+社区

领取腾讯云代金券