每星期撷取新一代,最盛行的软件设计科学知识与新一代金融行业态势,期望我们能全屏帕西基,喔全力支持,下跪关注,点赞,回帖。这篇昌明叙述了 WordPress 的 pingbacks 同时实现中一个比较简单的安全可靠漏洞。
WordPress 是世界上最畅销的内容信息系统, 超过 40% 的网站都在采用它。此种广为采用使其成为威胁参加者和安全可靠科学研究相关人员的重中之重最终目标,她们通过她们的公用安全可靠漏洞猎人计划调查报告安全可靠难题而赢得酬金。
安全可靠漏洞前女友也非找到化为乌有的成果。我以后对该最终目标的科学研究须要广为的专业科学知识和努力来辨认出安全可靠难题。
这篇昌明叙述了 WordPress 的 pingbacks 同时实现中一个比较简单的安全可靠漏洞。虽然此安全可靠漏洞对 WordPress 的绝大多数采用者的负面影响很小,但相关的Marchenoir的代码商业模式值得历史记录,因为它也可能存有于绝大多数 Web 插件中。这篇昌明的目的是宣传此种商业模式并认清形势。
披露
该安全可靠漏洞已于 1 月 21 日调查报告给 WordPress;已有复原方式。参见插件部分以赢得相关适用于您的 WordPress 示例的潜在预防措施的指导。
这是我和我的团队第一次正式发布相关未修整安全可靠漏洞的详细资料,那个决定并非轻率做出。大约六年前的 2017 年 1 月,另一位科学研究相关人员和多年来的许多其它人首次调查报告了那个难题。在我的调查报告和进一步调查之后,我还能辨识出余篇公用网志该文,这些该文历史记录了与我今天要介绍的犯罪行为相同的犯罪行为。
由于其原貌的低负面影响、以后的发布以及将其镜像到服务器端软件中的其它安全可靠漏洞的须要,我相信那个版不会严重危害 WordPress 采用者,只会帮助她们加强她们的示例。
负面影响
在不依赖其它Marchenoir的服务的情况下,我无法通用地确定借助此犯罪行为来接手易受攻击示例的方式。
它能减轻Toothukudi负面影响组织内部网络中其它安全可靠漏洞的借助,例如,采用最近的 Confluence OGNL 注入众所周知,@orange_8361在 Jenkins 中辨认出的叙事诗远距程序执行,或AssetNote历史记录的其它链众所周知。
用例在 Pingback 功能中采用Marchenoir的结构
Pingbacks 是网志作者在其它“朋友”网志引用取值该文时得到通知和表明的一种方式:它们与评论一起表明,能自由接受或拒绝。在主脑,网志必须相互执行 HTTP 请求以辨识镜像的存有。访客也能促发此机制。
此功能受到广为批评,因为它使攻击者能通过恶意要求数千个网志检查单个受害服务器上的 pingback 来执行分布式拒绝服务攻击。由于社交和社区功能在个人网志方面的重要性,因此在 WordPress 示例上默认情况下仍启用 Pingbacks。但是,预计这些请求不会发送到同一服务器或本地网段上托管的其它内部服务。
pingback 功能在 WordPress 的 XML-RPC API 上公开。提醒一下,这是一个须要 XML 文档的 API 端点,客户端能在其中选择要调用的函数和参数。
其中一个同时实现的方法是pingback.ping,期望参数pagelinkedfrom和pagelinkedto:第一个是引用第二个的该文的地址。
pagelinkedto必须指向本地示例的现有该文,此处http://blog.tld/?p=1,以及pagelinkedfrom应包含指向 的镜像的外部 URL pagelinkedto。
以下是对此端点的请求:
HTTP1个POST /xmlrpc.php HTTP/1.12个主机:POST /xmlrpc.php HTTP/1.1
Host: blog.tld […]
pingback.ping
http://evil.tld
http://blog.tld/?p=1
URL 验证的同时实现
WordPress 核心方式 wp_http_validate_url() 对采用者提供的 URL 运行几个检查以降低滥用风险。例如:
目的地不能包含采用者名和密码;主机名不得包含以下字符:#:?[]域名不应指向本地或私有 IP 地址,如 127.0.0.1、192.168.* 等。URL 的最终目标端口必须是 80、443 或 8080。第三步可能涉及解析域名(如果 URL 中存有)(例如,http://foo.bar.tld)。在此种情况下,远距服务器的 IP 地址是通过解析 URL[1]并稍后在验证它以排除非公用 IP 范围以后解析它[2]赢得的:
src/wp-includes/http.php
$parsed_url = parse_url( $url ); // [1]
// […]
$ip = gethostbyname( $host ); // [2]
// […]
if ( $ip === $host ) {
// Error condition for gethostbyname()
return false;
}
// IP validation happens here
}验证代码看起来正确执行,并且 URL 现在被认为是可信的。接下来发生什么?
HTTP 客户端的同时实现
两个 HTTP 客户端能在基于可用的 PHP 功能验证 URL 后处理 pingback 请求:Requests_Transport_cURL和Requests_Transport_fsockopen. 它们都是Requests库的一部分,在 WordPress 保护伞下独立开发。
让我们看看后者的同时实现。我知道它采用名称中的 PHP 流 API。它在传输级别运行,客户端必须手动制作 HTTP 请求。采用 再次解析 URL parse_url(),然后采用其主机部分创建与 PHP 流 API 兼容的最终目标(例如,tcp://host:port):
wp-includes/Requests/Transport/fsockopen.php
public function request($url, $headers = array(), $data = array(), $options = array()) {
$url_parts = parse_url($url);
$host = $url_parts[host];
else {
$remote_socket = tcp:// . $host;
$remote_socket .= : . $url_parts[port];
在更远的地方,那个目的地被用来创建一个新的流stream_socket_client(),并且 HTTP 请求被制作并写入它:
wp-includes/Requests/Transport/fsockopen.php
$socket = stream_socket_client($remote_socket, $errno, $errstr, ceil($options[connect_timeout]), STREAM_CLIENT_CONNECT, $context);
// […]
$out = sprintf(“%s %s HTTP/%.1F\r\n”, $options[type], $path, $options[protocol_version]);
// […]
if (!isset($case_insensitive_headers[Host])) {
$out .= sprintf(Host: %s, $url_parts[host]);
// […]
}
// […]
fwrite($socket, $out);正如我们所看到的,那个过程意味着另一个 DNS 解析,因此stream_socket_client()能辨识主机的 IP 来发送数据包。
另一个 HTTP 客户端 cURL 的犯罪行为非常相似,这里不再赘述。
安全可靠漏洞
此种构造有一个难题:HTTP 客户端必须重新解析 URL 并重新解析主机名才能发送其请求。同时,攻击者可能已将域更改为指向与以后验证的地址不同的地址!
此错误类也称为 Time-of-Check-Time-of-Use:资源经过验证但能在其有效采用以后进行更改。在针对服务器端请求伪造 (SSRF) 的缓解措施中辨认出此类安全可靠漏洞很常见。
我用下图总结了这些连续的步骤:
开发场景
我审核了代码,期望找到允许到达非预期端口或执行 POST 请求但未成功的解析器差异错误:初始 URL 验证步骤具有足够的限制性以防止它们被借助。如前所述,攻击者必须将此犯罪行为与另一个安全可靠漏洞联系起来才能显着负面影响最终目标组织的安全可靠。
修整
在撰写本出版物时,我不知道有任何可用的公用插件;以上详细资料基于在披露过程中与我们共享的中间插件。
解决此类安全可靠漏洞须要保留经过验证的数据,直到它用于执行 HTTP 请求。它不应在验证步骤后被丢弃或转换。
WordPress 维护者通过引入第二个可选参数来遵循这条路径wp_http_validate_url()。该参数通过引用传递,包含 WordPress 执行验证的 IP 地址。最终代码稍微冗长一些,以适应旧版的 PHP,但主要思想就在这里。
作为临时解决方式,我建议系统管理员删除pingback.pingXML-RPC 端点的处理程序。一种方式是更新正在采用的主题的 functions.php 以引入以下调用:
add_filter(xmlrpc_methods, function($methods) {
unset($methods[pingback.ping]);
return $methods;
});也能xmlrpc.php在 Web 服务器级别阻止访问。
概括
在本文中,我叙述了一个负面影响 WordPress Core 的盲目 SSRF 安全可靠漏洞。虽然在此种情况下负面影响很小,但这是一种广为存有的Marchenoir的代码商业模式,即使在大型项目中,我和我的团队也会继续遇到此种情况。我鼓励开发相关人员检查她们自己的代码库是否存有此类代码安全可靠漏洞,正如我所展示的那样,此种代码安全可靠漏洞甚至能隐藏在非常盛行和经过严格审查的代码中。
我要感谢 WordPress 维护者帮助解决那个难题,即使我无法达到最好的结果。