当前位置: 主页 > JAVA语言

java定义全局变量-如何利用JavaScript全局变量来绕过这些XSS安全防护机制?

发布时间:2023-06-11 22:10   浏览次数:次   作者:佚名

译文仅供参考,具体内容表达以及含义原文为准

◆◆◆ ◆◆

java定义全局变量_php 定义全局数组变量_qt定义全局结构体变量

写在前面的话

如果你发现你的攻击目标存在XSS漏洞,但是你所有的漏洞利用尝试似乎都被XSS过滤器(或输入验证和Web应用防火墙规则)屏蔽掉了的话,那你该怎么办?非常好,在这篇文章中,我们将告诉大家如何利用JavaScript全局变量来绕过这些XSS安全防护机制。

接下来,我们将讨论利用反射型或存储型XSS漏洞的各种可能性,并绕过我们与目标站点之间的XSS过滤器或防火墙。而在我们看来,其中一种最为有效的绕过方法就是利用类似self、document、this、top或window这样的全局变量。

注意:在接下来的Payload测试过程中,我主要使用的是PortSwigger Web Security Academy实验平台,但是你也可以使用浏览器自带的JavaScript控制台来进行测试。

前期准备工作

JavaScript全局变量到底是“何方神圣”?

根据javapoint.com的介绍:一个JavaScript全局变量必须在函数外声明,或与窗口对象一起声明,并且能够被任何函数访问。

我们假设,你的目标Web应用程序(某个JavaScript字符串或JavaScript函数存在安全问题)存在反射型XSS漏洞。那么,请大家先看看下面这段PHP脚本代码:

echo "";

大家可以看到,这里的“name”参数存在漏洞。但是在我们的演示样例中,目标Web应用程序设置了一个过滤器来防止他人利用“document.cookie”这个字符串来作为用户输入数据java定义全局变量,过滤器使用的正则表达式形如“/document[^.].[^.]cookie/”。大家先看看下面这些Payload:

qt定义全局结构体变量_php 定义全局数组变量_java定义全局变量

在这里,JavaScript全局变量可以用来绕过这个过滤器。我们有很多种方法来从window对象或self对象中访问到document.cookie,比如说,“window[“document”][“cookie”]”就不会被这个过滤器过滤掉:

java定义全局变量_qt定义全局结构体变量_php 定义全局数组变量

php 定义全局数组变量_java定义全局变量_qt定义全局结构体变量

大家可以从上面的截图中看到,我们可以利用“self“alert”;”(该语句的作用等同于“alert(“foo”);”)这样的语句来访问任何一个JavaScript函数。这种类型的语句可以帮助我们绕过很多存在安全问题的过滤器。很明显,我们几乎可以在任何地方通过注释的方式来使用这种类型的语句:

(/* this is a comment */self/* foo */)[/*bar*/"alert"/**/]("yo")

qt定义全局结构体变量_java定义全局变量_php 定义全局数组变量

关于“self”对象

Window.self的只读属性可以将window对象本身以WindowProxy返回,它能够以“window.self”或直接是“self”的形式来使用。这种单独标注的使用形式有点就在于它跟非window对象的使用场景很相似,使用“self”,我们就可以尝试找到非window对象的使用场景,因为“self”会被解析为“window.self”。比如说Web Workers,在worker场景下,“self”将会被解析为“WorkerGlobalScope.self”。【参考资料】

我们可以利用以下对象来调用任何一种JavaScript函数:

windowself_selfthistopparentframes

1、 字符串连接和十六进制转义序列

目前,在绕过Web应用防火墙规则时,最常见的一种技术就是字符串连接。这种方式不仅适用于远程代码执行和SQL注入攻击,而且同样适用于JavaScript场景。

现在有很多Web应用防火墙所使用的过滤器是基于JavaScript函数名列表来实现的,而这种类型的过滤器可以屏蔽包含了类似“alert()”或“String.fromCharCode()”字符串的请求。在全局变量的帮助下,我们就可以使用字符串连接或十六进制转义序列来轻松绕过这些过滤器了。比如说:

/** alert(document.cookie);/
self“ale”+”rt”

qt定义全局结构体变量_java定义全局变量_php 定义全局数组变量

当然了,还有一种更加复杂的语句可以绕过过滤器java定义全局变量,也就是用十六进制转义序列来替换之前的字符串。任何字符码低于“256”的字符都可以使用十六进制码来表示,即使用“x”转义序列:

> console.log(“x68x65x6cx6cx6fx2cx20x77x6fx72x6cx64x21”)

< hello, world!

java定义全局变量_php 定义全局数组变量_qt定义全局结构体变量

大家可以看到,使用十六进制序列来替换对应的“alert”、“document”和“cookie”字符串可以帮助我们通过全局变量来调用任意函数:

/*** alert(document.cookie)*/
self["\x61\x6c\x65\x72\x74"]( self["\x64\x6f\x63\x75\x6d\x65\x6e\x74"] ["\x63\x6f\x6f\x6b\x69\x65"])

qt定义全局结构体变量_php 定义全局数组变量_java定义全局变量

php 定义全局数组变量_qt定义全局结构体变量_java定义全局变量

2、 Base64编码字符串和eval()

如果一个Web应用防火墙过滤掉了我们的输入,那么最困难的一件事情就是去实现动态创建(或增加)一个脚本元素,并调用一个远程JavaScript文件(类似