Author: p0wd3r (知道創宇404安全實驗室)

0x00 漏洞概述

1.漏洞簡介

WordPress是一個以PHP和MySQL為平臺的自由開源的博客軟件和內容管理系統,近日在github (https://gist.github.com/anonymous/908a087b95035d9fc9ca46cef4984e97)上爆出這樣一個漏洞,在其<=4.6.1版本中,如果網站使用攻擊者提前構造好的語言文件來對網站、主題、插件等等來進行翻譯的話,就可以執行任意代碼。

2.漏洞影響

任意代碼執行,但有以下兩個前提:

  1. 攻擊者可以上傳自己構造的語言文件,或者含有該語言文件的主題、插件等文件夾
  2. 網站使用攻擊者構造好的語言文件來對網站、主題、插件等進行翻譯

這里舉一個真實場景中的例子:攻擊者更改了某個插件中的語言文件,并更改了插件代碼使插件初始化時使用惡意語言文件對插件進行翻譯,然后攻擊者通過誘導管理員安裝此插件來觸發漏洞。

3.影響版本

<= 4.6.1

0x01 漏洞復現

1. 環境搭建

docker pull wordpress:4.6.1
docker pull mysql
docker run --name wp-mysql -e MYSQL_ROOT_PASSWORD=hellowp -e MYSQL_DATABASE=wp -d mysql
docker run --name wp --link wp-mysql:mysql -d wordpress

2.漏洞分析

首先我們來看這樣一個場景:

Alt text

在調用create_function時,我們通過}將原函數閉合,添加我們想要執行的內容后再使用/*將后面不必要的部分注釋掉,最后即使我們沒有調用創建好的函數,我們添加的新內容也依然被執行了。之所以如此,是因為create_function內部使用了eval來執行代碼,我們看PHP手冊上的說明:

Alt text

所以由于這個特性,如果我們可以控制create_function$code參數,那就有了任意代碼執行的可能。這里要說一下,create_function這個漏洞最早由80sec在08年提出,這里提供幾個鏈接作為參考:

接下來我們看Wordpress中一處用到create_function的地方,在wp-includes/pomo/translations.php第203-209行:

/**
 * Makes a function, which will return the right translation index, according to the
 * plural forms header
 * @param int    $nplurals
 * @param string $expression
 */
function make_plural_form_function($nplurals, $expression) {
    $expression = str_replace('n', '$n', $expression);
    $func_body = "
        \$index = (int)($expression);
        return (\$index < $nplurals)? \$index : $nplurals - 1;";
    return create_function('$n', $func_body);
}

根據注釋可以看到該函數的作用是根據字體文件中的plural forms這個header來創建函數并返回,其中$expression用于組成$func_body,而$func_body作為$code參數傳入了create_function,所以關鍵是控制$expresstion的值。

我們看一下正常的字體文件zh_CN.mo,其中有這么一段:

Alt text

Plural-Froms這個header就是上面的函數所需要處理的,其中nplurals的值即為$nplurals的值,而plural的值正是我們需要的$expression的值。所以我們將字體文件進行如下改動:

Alt text

然后我們在后臺重新加載這個字體文件,同時進行動態調試,可以看到如下情景:

Alt text

我們payload中的)首先閉合了前面的(,然后結束前面的語句,接著是我們的一句話木馬,然后用/*將后面不必要的部分注釋掉,通過這樣,我們就將payload完整的傳入了create_function,在其創建函數時我們的payload就會被執行,由于訪問每個文件時都要用這個對字體文件解析的結果對文件進行翻譯,所以我們訪問任何文件都可以觸發這個payload:

Alt text

Alt text

其中訪問index.php?c=phpinfo();的函數調用棧如下:

Alt text

3.補丁分析

目前官方還沒有發布補丁,最新版仍存在該漏洞。

0x02 修復方案

在官方發布補丁前建議管理員增強安全意識,不要使用來路不明的字體文件、插件、主題等等。

對于開發者來說,建議對$expression中的特殊符號進行過濾,例如:

$not_allowed = array(";", ")", "}");
$experssion = str_replace($not_allowed, "", $expression);

0x03 參考

https://www.seebug.org/vuldb/ssvid-92459

https://gist.github.com/anonymous/908a087b95035d9fc9ca46cef4984e97

http://php.net/manual/zh/function.create-function.php

https://www.exploit-db.com/exploits/32416/

https://bugs.php.net/bug.php?id=48231

http://www.2cto.com/Article/201212/177146.html

https://codex.wordpress.org/Installing_WordPress_in_Your_Language


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/63/