【问题标题】:jump out of a JS variable encapsulation跳出一个JS变量封装
【发布时间】:2011-11-30 18:16:20
【问题描述】:

我正在阅读一本关于 XSS 攻击的书,我发现了一个关于 XSS 过滤器规避的例子,这有点奇怪(恕我直言)。

这是示例文本:

另一个可能存在的注入点是开发人员使用 unsanitized 用户输入作为脚本元素中生成的 HTML 的一部分。例如:


var query_string="";
一些函数(查询字符串);
函数 somefunction {
...
}
脚本>

看来我们可以访问 JavaScript 函数的内部。让我们尝试添加一些 引号,看看能不能跳出封装:


var query_string="";
一些函数(查询字符串);
函数 somefunction {
...
}

它成功了,并且在过程中也导致了一个 JavaScript 错误,如图 3.38 所示。 让我们再试一次,但不要尝试注入 HTML,让我们直接使用 JavaScript。因为无论如何我们都在一个脚本标签中,为什么不利用它来发挥我们的优势呢?


var query_string="";alert(“XSS”);//";
一些函数(查询字符串);
函数 somefunction {
...
}

bold 文本是我认为是用户输入的内容,例如来自表单。

回到我的问题:这种攻击有什么方法有效吗?例如,假设somefunction(query_string) 用于运行一些sql 查询,query_string 是要在数据库中搜索的产品名称。如果在搜索函数中我创建sql_query = 'SELECT name FROM table WHERE name = "'+query_string+'"';,我认为没有办法注入一些带引号的字符串来“跳出封装”,即输入YAY";alert('hi');//不会将JS更改为:

var query_string = [user input, in this case YAY";alert('hi');//]
function abc(query_string){
    sql_query = "select name FROM table WHERE name = 'YAY';
    alert('hi');//
    ....
}

我错了吗?你怎么看?你能给我举一个简单的例子(如果可能的话),说明这种攻击如何造成某种损害?

我想过网店之类的东西,但是假设服务器端不使用JS,这种攻击唯一能做的就是修改查询字符串,然后将其提交给服务器..

希望你能理解我写的和我想理解的,谢谢,最好的问候。

【问题讨论】:

  • 你为什么不尝试自己运行一些这个脚本呢?
  • 你到底为什么要在客户端构建 SQL 查询?
  • 这只是为了了解一种可能的攻击类型,显然这不是一件好事。 :)
  • query stringsSQL queries 之间存在很大差异。 SQL 查询与您书中的示例无关,因此我认为您混淆了您的术语。
  • XSS 通常是通过 JavaScript 注入完成的,这与 SQL 注入非常相似。两者都有其细微差别,都需要对清理用户输入保持警惕。

标签: javascript html sql xss


【解决方案1】:

你应该只看第一行。其余的在这个 xss 示例中没有发挥作用。这是一个选择不当的例子。所以举个简单的例子

var first_name="<XSS>";

在此示例中,&lt;xss&gt; 是用户生成的内容。所以你的例如php代码是这样的

var first_name="<? echo $firstName; ?>";

$firstName 取自某个数据库或其他东西,并由将其键入某个文本字段的用户生成。假设用户键入:";alert("XSS");//。 PHP会生成如下代码

var first_name="";alert("XSS");//";

印刷精美:

var first_name="";
alert("XSS");
//";

如您所见,用户能够在访问该页面的所有其他用户浏览器中运行他的代码alert("XSS")。在这个例子中除了一些警告框不会发生任何坏事,但是用户可能会注入一些代码来获取 cookie 信息并将其发送到某个服务器,因此攻击者可以窃取某人的登录会话。

同样的问题 - 忘记转义用户生成的内容 - 也适用于创建 sql 查询,但这与本示例无关。这个例子的创建者应该在他的例子中使用query_string,因为它显然是令人困惑的。

【讨论】:

  • 我认为作者想说的有点不同..他试图解释如何从未净化的用户输入中控制 js 函数,但我不明白它是如何可能无需直接打印/回显变量的值(如您的示例中,使用 php)。也许我错了,但我认为在定义变量的同时注入一些代码是不可能的。你的意见是什么?无论如何感谢您的有用示例!
  • 只有在使用字符串从一种语言转换到另一种语言时才会出现注入问题。 PHP 生成 JS,JS 生成 SQL 查询等。在处理这些“边界”时,您应该始终使用正确的转义方法或清理输入。因此,正如您所说,一旦定义了变量,转换就已经发生,因此不会发生任何进一步的注入,除非您进行另一个转换,例如使用变量创建查询。所以永远不要相信用户输入,或者你不确定的脚本设置的变量是否安全。
  • 所以没有办法通过输入一个带代码的字符串来控制同一种语言中的函数,对吧?控制权是指将函数分成两部分,在原始函数中输入输入的位置,然后使用输入“丢弃”其余部分以添加新的恶意代码。再次感谢您耐心地向我解释这些事情,您的提示对我很有帮助。
  • 没有。 JS 知道变量包含一个字符串。它不会尝试将该字符串评估为 JS。它只是一块内存。
猜你喜欢
  • 2014-12-09
  • 1970-01-01
  • 2017-07-23
  • 2012-11-26
  • 2021-12-27
  • 2011-09-26
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
相关资源
最近更新 更多