掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

WordPress <= 4.6.1 使用语言文件任意代码执行 漏洞分析

0x00 漏洞概述  


1.漏洞简介


WordPress是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统,近日在 github 上爆出这样一个漏洞,在其 <=4.6.1 版本中,如果网站使用攻击者提前构造好的语言文件来对网站、主题、插件等等来进行翻译的话,就可以执行任意代码。

2.漏洞影响


任意代码执行,但有以下两个前提:

  1. 攻击者可以上传自己构造的语言文件,或者含有该语言文件的主题、插件等文件夹
  2. 网站使用攻击者构造好的语言文件来对网站、主题、插件等进行翻译

这里举一个真实场景中的例子:攻击者更改了某个插件中的语言文件,并更改了插件代码使插件初始化时使用恶意语言文件对插件进行翻译,然后攻击者通过诱导管理员安装此插件来触发漏洞。

3.影响版本


<= 4.6.1

0x01 漏洞复现


1. 环境搭建


docker pull wordpress<span class="token punctuation">:</span><span class="token number">4.6</span><span class="token punctuation">.</span><span class="token number">1</span>  
docker pull mysql  
docker run <span class="token operator">--</span>name wp<span class="token operator">-</span>mysql <span class="token operator">-</span>e MYSQL_ROOT_PASSWORD<span class="token operator">=</span>hellowp <span class="token operator">-</span>e MYSQL_DATABASE<span class="token operator">=</span>wp <span class="token operator">-</span>d mysql  
docker run <span class="token operator">--</span>name wp <span class="token operator">--</span>link wp<span class="token operator">-</span>mysql<span class="token punctuation">:</span>mysql <span class="token operator">-</span>d wordpress

2.漏洞分析


首先我们来看这样一个场景:

在调用create_function时,我们通过}将原函数闭合,添加我们想要执行的内容后再使用/*将后面不必要的部分注释掉,最后即使我们没有调用创建好的函数,我们添加的新内容也依然被执行了。之所以如此,是因为create_function内部使用了eval来执行代码,我们看PHP手册上的说明:

所以由于这个特性,如果我们可以控制create_function的$code参数,那就有了任意代码执行的可能。这里要说一下,create_function这个漏洞最早由80sec在08年提出,这里提供几个链接作为参考:

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

<span class="token comment">/**
* Makes a function, which will return the right translation index, according to the
* plural forms header
* @param int    $nplurals
* @param string $expression
*/</span>
<span class="token keyword">function</span> <span class="token function">make_plural_form_function<span class="token punctuation">(</span></span><span class="token variable">$nplurals</span><span class="token punctuation">,</span> <span class="token variable">$expression</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  
    <span class="token variable">$expression</span> <span class="token operator">=</span> <span class="token function">str_replace<span class="token punctuation">(</span></span><span class="token string">'n'</span><span class="token punctuation">,</span> <span class="token string">'$n'</span><span class="token punctuation">,</span> <span class="token variable">$expression</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token variable">$func_body</span> <span class="token operator">=</span> "
        \<span class="token variable">$index</span> <span class="token operator">=</span> <span class="token punctuation">(</span>int<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token variable">$expression</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token punctuation">(</span>\<span class="token variable">$index</span> <span class="token operator">&lt;</span> <span class="token variable">$nplurals</span><span class="token punctuation">)</span><span class="token operator">?</span> \<span class="token variable">$index</span> <span class="token punctuation">:</span> <span class="token variable">$nplurals</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span>"<span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token function">create_function<span class="token punctuation">(</span></span><span class="token string">'$n'</span><span class="token punctuation">,</span> <span class="token variable">$func_body</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

根据注释可以看到该函数的作用是根据字体文件中的plural forms这个header来创建函数并返回,其中$expression用于组成$func_body,而$func_body作为$code参数传入了create_function,所以关键是控制$expresstion的值。

我们看一下正常的字体文件zh_CN.mo,其中有这么一段:

Plural-Froms这个 header 就是上面的函数所需要处理的,其中nplurals的值即为$nplurals的值,而plural的值正是我们需要的$expression的值。所以我们将字体文件进行如下改动:

然后我们在后台重新加载这个字体文件,同时进行动态调试,可以看到如下情景:

我们payload中的)首先闭合了前面的(,然后;结束前面的语句,接着是我们的一句话木马,然后用/*将后面不必要的部分注释掉,通过这样,我们就将payload完整的传入了create_function,在其创建函数时我们的payload就会被执行,由于访问每个文件时都要用这个对字体文件解析的结果对文件进行翻译,所以我们访问任何文件都可以触发这个payload:

其中访问index.php?c=phpinfo();的函数调用栈如下:

3.补丁分析


目前官方还没有发布补丁,最新版仍存在该漏洞。

0x02 修复方案


在官方发布补丁前建议管理员增强安全意识,不要使用来路不明的字体文件、插件、主题等等。

对于开发者来说,建议对$expression中的特殊符号进行过滤,例如:

<span class="token variable">$not_allowed</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string">";"</span><span class="token punctuation">,</span> <span class="token string">")"</span><span class="token punctuation">,</span> <span class="token string">"}"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$experssion</span> <span class="token operator">=</span> <span class="token function">str_replace<span class="token punctuation">(</span></span><span class="token variable">$not_allowed</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">,</span> <span class="token variable">$expression</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

0x03 参考


原文来自:知道创宇blog

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 活体人脸实名认证H5版

    本服务搭载真人检测和人脸比对等生物识别技术,配合权威数据源验证,可快速校验自然人的真实身份。支持PC和移动端H5网页接入。

    本服务搭载真人检测和人脸比对等生物识别技术,配合权威数据源验证,可快速校验自然人的真实身份。支持PC和移动端H5网页接入。

  • 营运车判定查询

    输入车牌号码或车架号,判定是否属于营运车辆。

    输入车牌号码或车架号,判定是否属于营运车辆。

  • 名下车辆数量查询

    根据身份证号码/统一社会信用代码查询名下车辆数量。

    根据身份证号码/统一社会信用代码查询名下车辆数量。

  • 车辆理赔情况查询

    根据身份证号码/社会统一信用代码/车架号/车牌号,查询车辆是否有理赔情况。

    根据身份证号码/社会统一信用代码/车架号/车牌号,查询车辆是否有理赔情况。

  • 车辆过户次数查询

    根据身份证号码/社会统一信用代码/车牌号/车架号,查询车辆的过户次数信息。

    根据身份证号码/社会统一信用代码/车牌号/车架号,查询车辆的过户次数信息。

0512-88869195
数 据 驱 动 未 来
Data Drives The Future