HTML 和 JavaScript 注入






4.86/5 (14投票s)
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 等方式刷新客户端。
<TITLE>
示例一样,最好不要使用动态 DOM 元素生成。<TITLE>
示例)。想象一下 PHP 页面中的这段代码:$dato = $_GET['formAge'];
eval('$edad = ' . $dato . ';');
eval()
参数将被处理,因此如果“formAge
”设置为“5; system('/bin/rm -rf *')”,则将在服务器上执行其他代码,并删除所有文件。危险,您不觉得吗?
strip_tags()
PHP 函数、htmlentities()
、urlencode()
或 htmlspecialchars()
来实现这一点,例如。最终,防御代码注入攻击的最佳方法在于编程时的“最佳实践”。
关注点
程序员在实现 Web 应用程序中的安全功能时有时会疏忽,从而使项目暴露给攻击者。
历史
- 1.0 - 2010/05/12 - 原始版本。