PHP < 5.2.0 Buffer Overflows in htmlspecialchars() and htmlentities()

2006-11-07 12:27

htmlspecialchars()htmlentities() ,
是 php web programmer 常用的 function

用來將某些網頁特殊字元, 轉換成相對應的 HTML entities ,
例如 < = &lt; 、 > = &gt; 、 ” = &quot; ... 等等,
同時它們也常用來防止網頁產生 XSS 漏洞.

幾日前,
國外的 Hardened-PHP Project 發現這兩個 function 存在 heap overflow 的漏洞 ,
可能導致遠端惡意使用者執行任意指令.
不過這只有在特定情況下 - 當使用 UTF-8 charset 時, 才會發生 .

原因在於 htmlentities 的實作 , PHP source code 的 ext/standard/html.c 中

PHPAPI char *php_escape_html_entities( .... )
{
  ....
  ....
  if (len + 9 > maxlen)
    replaced = erealloc (replaced, maxlen += 128);
  ...
  ...
}

當轉換用的 buffer , 再塞 10 bytes 資料會到底的話, 就會 realloc 多 128 bytes .
這本來也沒什麼問題, 因為一般的 HTML entities 都在 8 個字元以下 ,
但有個例外 - Greek character set 會超過 !

所以當惡意的攻擊者塞入特定的字元 ( Greek character set、或來自 0×00, 0xc0-0xfd ) 後,
可能導致 server 端在 realloc() 時發生 heap overflow ,
而執行到其中的惡意代碼 ( 加檔案、開後門、塞木馬、... 等等都有可能 )

解決方式 -
目前 PHP 官方放出的最新版 5.2.0 已經修正了這個問題 ,
而也只有這個版本的 PHP 不受影響 , 其他 < 5.2.0 的通通有可能爆 ...

( 以下為個人看法, 未經實驗, 請自行承擔後果 :> )
真的不想冒然衝上 5.2 的話 , 也可以將之前的版本手動 patch 一遍,
將 5.2.0 裡 ext/standard/html.c 中的 php_escape_html_entities( ) 整個搬過去舊版的
再 recompile 一隻起來 , 應該就沒事了 :p

相關報導 -

http://www.securitytracker.com/alerts/2006/Nov/1017152.html
http://www.hardened-php.net/advisory_132006.138.html


Security 類別的文章 :
95年全國大專院校資安技能競賽Wordpress 2.0.5 Remote File Include Vulnerability

Vulnerability 類別的文章 :
Linux Kernel >= 2.6.13 && < 2.6.17.4 sys_prctl() Local Root ExploitWordpress 2.0.5 Remote File Include Vulnerability

2 則留言 新增留言

  • 1. ajneok  |  November 7th, 2006 at 22:34

    orz...
    我的最愛→AJNeoK→Black→Outian's 芭樂閣 ...
    擺對地方了...

  • 2. OuTian  |  November 7th, 2006 at 23:44

    喂喂 樓上的不要亂歸類呀

    明明是阿都仔發現的

    我只是分析一下, 提醒大家咩 :>

新增留言

*

*

訂閱這則留言的 RSS Feed


各分類文章

最近的 20 篇文章