在当今的网络世界中,代码注入攻击是一种常见的安全威胁。尽管完全易受攻击的网站越来越少见,但只要存在一个漏洞,攻击者就可能利用它。本文将对这些技术进行汇编,以便于阅读并增加趣味性。HTML注入是一种攻击方式,它侧重于HTML内容的生成和浏览器在客户端的解释。此外,JavaScript是动态网站广泛使用的技术,基于此的注入技术补充了“代码注入”的术语。
这种攻击方式之所以可能,是因为客户端浏览器默认情况下能够解释嵌入在HTML内容中的脚本。如果攻击者将脚本标签嵌入到网站中,如<SCRIPT>
、<OBJECT>
、<APPLET>
或<EMBED>
,浏览器的JavaScript引擎将执行它。这种注入的典型目标是论坛、留言簿或任何允许插入文本评论的部分;如果网站的设计没有解析插入的评论,并且将'<'或'>'视为真实字符,恶意用户可能会输入:
<script>alert('Injected!');</script>
如果它起作用并且能看到消息框,那么攻击者就可以发挥他们的想象力了!一个常见的代码注入是驱动导航到另一个网站,如下所示:
<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')}">
如果<TITLE>
标签是动态生成的,它是一个常见的弱点。例如,假设这种情况:
<HTML><HEAD><TITLE><?php echo $_GET['titulo']; ?></TITLE></HEAD><BODY>...</BODY></HTML>
如果构建标题为'example </title></head><body><img src=http://myImage.png>',HTML结果将首先插入'image.png'图片:
<HTML><HEAD><TITLE>example</TITLE></HEAD><BODY><img src=http://myImage.png></BODY></HTML>
还有另一个危险的HTML标签可能会利用Web浏览器的框架支持特性:<IFRAME>
。这个标签允许(在沙箱安全层内)跨脚本利用使用Web浏览器元素(例如地址栏或书签),但这个主题超出了本文的范围。
这种技术利用了JavaScript函数"alert"和"void"。测试它非常简单,只需导航到任何网站,在Web浏览器的地址栏中输入:
javascript:alert('Executed!');
这不是一个有害的脚本,如所见,但假设想要获取有关网站的信息,例如,它是否使用cookies,可以输入类似这样的东西:
javascript:alert(document.cookie);
如果网站不使用cookies,没问题,但否则,可以读取像服务器会话ID或应用程序存储在cookies中的任何用户数据这样的值。
在开发Web应用程序时,非常建议遵循以下注意事项以防止可能的代码注入:
1. 尽可能不要依赖客户端JavaScript验证;如前所示,这很容易使用"内联"注入欺骗。例如,假设有一个购物门户网站,在客户端依赖每个项目的价格。
2. 不要在cookies中存储敏感数据,因为它们可以被攻击者轻易修改,如前所述。如果需要在cookies中存储数据,请使用服务器端密钥生成的哈希签名存储它们。
3. 永远不要使用隐藏框来保存项目,因为它们可以被硬编码到代码中。否则,应该始终在服务器端使用安全算法验证字段,使用从客户端接收的数据作为输入:
4. 不要使用动态DOM元素生成。
5. 注意动态评估漏洞(如上例中的<TITLE>
)。想象一下在PHP页面中的这段代码:
$dato = $_GET['formAge']; eval('$edad = '.$dato.';');
eval()参数将被处理,所以如果"formAge"设置为"5; system('/bin/rm -rf *')",附加代码将在服务器上执行并删除所有文件。危险,不是吗?
6. 如果正在开发一个允许用户上传内容的网站(论坛、留言簿、"联系"等),可以分割特殊HTML字符,这样注入的标签将被保留在网站上,但不会被执行;可以通过PHP函数strip_tags()、htmlentities()、urlencode()或htmlspecialchars()实现这一点。
7. 对于敏感操作,请使用SSL证书;这并不能避免JavaScript注入,但可以防止敏感数据被其他人读取。
最终,防御代码注入攻击的最佳防御在于编程时的"最佳实践"。