最后更新于2023年12月27日星期三15:04:09 GMT
今天,Rapid7披露了影响三个开源项目的9个漏洞: EspoCRM, Pimcore, Akaunting. 在此之前,我要特别感谢这三位开源项目维护者. 虽然了解自己产品中的新漏洞从来都不是一件好事, 所有3个项目维护者都接受了, 验证, 并为这些漏洞提供了修复程序 有一天,,这在漏洞披露方面是惊人的. EspoCRM于5月4日收到通知, 2021 和 patched source on May 5; Akaunting, on May 13 和 turned it around on May 14; 和 Pimcore 验证 their vulnerabilities on April 29 after learning about them on April 28, 2021. 干得好,到处都是.
现在, 我不确定为什么开源软件比典型的专有软件漏洞修补程序要快得多, 至少对我所参与的泄密事件负责. 这可能是因为, 在开源中, you're almost guaranteed to have your first communication with a h和s-on-keyboard software engineer who is personally 和 emotionally invested in the software; whereas in proprietary l和, 第一个联系人可能是一个监控不严密的辅助化名, 由第三方提供商提供人员. Rapid7的漏洞披露过程 假定我们向供应商报告的任何漏洞至少有60天的修复时间, 我想大概有一半的时间, 从报告到披露大概需要90到120天的时间, 有时, 我们只能选择在没有解决方案的情况下发布游戏.
当然, 专有软件偶尔会在验证和源代码修复方面提供快速的周转时间, 也一样(SonicWall 我想起来了), 专有供应商通常有很好的理由花时间承认, 修复, 测试, releasing fixes; but the fact remains that what's normal 在开源中 communities — hyperfast turnaround on 修复 reported vulnerabilities — is a rarity in proprietary software.
顺便说一下,这些不是一两个人的激情项目. 这三个项目都有真正的用户, 他们的辅助支持服务和云托管版本的真实客户, 毫无疑问,它们是当今支持成千上万中小型企业的核心应用程序. This popularity is the reason why Trevor 和 Wiktor took a look at them in the first place; they suspected these small-to-medium business applications haven't seen a ton of attention from the eye of a penetration tester, 这篇博文就是检验这个假设的结果.
与, 我将停止一般地挑选专有软件供应商,转而看看这些特定项目中的特定漏洞.
常见漏洞类别
从这个完全不科学且统计上无关紧要的漏洞样本中, 我们可以得出一个毫不奇怪的结论,即企业web应用程序往往会受到常见web应用程序漏洞的影响. 以下是持久性跨站点脚本(XSS)的例子, 恶意用户可以在应用程序中植入一些浏览器可执行代码的地方, 哪一个被设计成等待,并在其他人出现并加载代码时触发, 2是SQL注入(SQLi)漏洞, 攻击者使用web应用程序作为复杂的门户,向后台数据库发出直接命令, 通常是为了窃取数据或创建强大的web应用程序用户.
SQL注入曾经是一种获得命令注入路径到底层操作系统的好方法, 但这在如今已经很罕见了. 但, 这里披露的一个问题是命令注入问题, 我们认为哪一个是最严重的漏洞, 因为它可以让攻击者控制操作系统,并将其用作进入网络其他部分的滩头阵地, 安装密码破解器或勒索软件, 或者执行其他低级别的邪恶行为.
其余的漏洞是:拒绝服务漏洞, where the attacker can crash the whole application with a naughty HTTP request; an authentication bypass, where the attacker can move from one logical group to another without authorization; 和 a weak password-reset vulnerability, 攻击者可以滥用“我忘记密码”功能,从应用程序向注册用户发送钓鱼电子邮件.
下表提供了今天披露的9个漏洞的重要信息. 请注意,这里列出的每个漏洞都由供应商以典型的开源方式及时修复. 简而言之:如果您在业务中使用任何这些应用程序并保持更新, 你已经有了解决方案. 这篇文章的其余部分详细介绍了个人的发现 有意年代ędkowski 以及Rapid7的Trevor Christiansen, 谁在这个项目中一起工作,并通过Rapid7的漏洞披露流程披露了这些问题.
我们今天公布这些细节, 类似的web应用程序可以意识到这些漏洞类,并查看自己的代码库,以确保它们不会犯同样的错误. 谢谢,维克多和特雷弗!
CVE | 受影响的项目 | CWE | 基地CVSS | 状态 |
---|---|---|---|---|
cve - 2021 - 3539 | EspoCRM v6.1.6 | CWE-79(持久XSS) | 6.3(中) | 在第6版修复.1.7 |
cve - 2021 - 31867 | Pimcore客户数据框架v3.0.0 | CWE-89 (SQL注入) | 6.5(中) | 修复在v3.0.2 |
cve - 2021 - 31869 | Pimcore AdminBundle v6.8.0 | CWE-89 (SQL注入) | 6.5(中) | 修复在v6.9.4 |
cve - 2021 - 36800 | Akaunting v2.1.12 | CWE-94(代码注入) | 8.7(高) | 修正了在akaaccounting v2.1.13 |
cve - 2021 - 36801 | Akaunting v2.1.12 | CWE-639 (Auth旁路) | 8.5(高) | 修正了在akaaccounting v2.1.13 |
cve - 2021 - 36802 | Akaunting v2.1.12 | CWE-248(未捕获异常DoS) | 6.5(中) | 修正了在akaaccounting v2.1.13 |
cve - 2021 - 36803 | Akaunting v2.1.12 | CWE-79(持久XSS) | 6.3(中) | 修正了在akaaccounting v2.1.13 |
cve - 2021 - 36804 | Akaunting v2.1.12 | CWE-640(弱密码重置) | 5.4(中) | 修正了在akaaccounting v2.1.13 |
cve - 2021 - 36805 | Akaunting v2.1.12 | CWE-79(持久XSS) | 5.2(中) | 修正了在akaaccounting v2.1.13 |
EspoCRM v6.1.6(1期)
EspoCRM是一个开源的客户关系管理(CRM)应用程序,用于各种行业, 尽管它似乎在房地产领域取得了特别的成功. 有关EspoCRM的更多信息,请访问 供应商的网站.
cve - 2021 - 3539: EspoCRM Avatar持久XSS
任何具有默认权限的用户, 他们可以上传自己的头像吗, 可以通过提供可执行的Javascript代码而不是图像来滥用API吗. 下面是一个调用API的示例:
PUT /api/v1/User/609108e6b123bb29d HTTP/1.1
主持人:10.0.0.10:8443
{屏蔽}
内容长度:43
来源:http://10.0.0.10:8443
连接:关闭
推荐人:http://10.0.0.10:8443/
饼干:{屏蔽}
{
"avatarId":" onerror= "alert(0) "
}
这导致将角色渲染为:
导致触发' onerror '事件:
因为EspoCRM允许管理员任意安装, 自定义扩展, 攻击者可以利用这种XSS悄无声息地强迫管理员(查看攻击者的头像)安装恶意扩展, 从而保持对web应用程序的永久控制, 如下面的截图所示.
Pimcore客户数据框架v3.0.0(1期)
Pimcore CDF是Pimcore平台的一个组件,是一个CRM企业应用程序. 更多关于Pimcore CDF的信息,请访问 供应商的网站.
cve - 2021 - 31867: Pimcore CDF的SegmentAssignmentController.php'盲SQL注入
客户管理框架包中存在SQL注入漏洞, 特别是在SegmentAssignmentController中.php组件. 漏洞代码是在commit 6fc8aff8f95fc168d173ef3b473760dd98d026c4中引入的,如下所示.
php
公共函数inheritableegments (Request $ Request)
{
$id = $request->get('id') ?? '';
$type = $request->get('type') ?? '';
/* @var $db Connection *
$db = $this->get(Connection::class);
$parentId状态ment = sprintf('SELECT ' %s ' FROM ' %s ' WHERE ' %s ' = ' %s ' ', $type === 'object') ? 'o_parentId': 'parentId', $type.'s', $type === 'object' ? 'o_id': 'id', $id);
$parentId = $db->fetchOne($parentId状态ment);
$segments = $this->get(Segment经理Interface::class)->getSegmentsForElementId($parentId, $type);
$data = array_map([$this, 'dehydrateSegment'], array_filter($segments));
return $this->adminJson(['data' => array_values($data)]);
}
从请求参数中检索' $id ',然后通过使用' sprintf '直接放入SQL查询中,然后执行(只要' $type '不是' object ')。. 这允许恶意行为者通过使用单个引号" '注入SQL查询。.
这个漏洞可以被认为是基于布尔的盲目SQL注入, 由于漏洞无法直接从数据库中提取数据, 但必须通过一系列真/假请求将信息拼凑起来.
下图显示了一个测试整数1是否等于1的请求:
响应返回' 200 OK '以及' id '为137的数据:
第二个请求测试整数1是否等于2:
这一次,响应是“500内部服务器错误”以及堆栈跟踪.
使用这两个查询,恶意行为者可以自动从数据库中检索信息. 最后一个示例显示了从数据库服务器查找版本的第一个字符的查询.
Pimcore AdminBundle v6.8.0(1期)
Pimcore AdminBundle是Pimcore核心平台的一部分, 产品信息管理(PIM)平台, 哪些与企业资源计划(ERP)功能密切相关. 有关Pimcore平台的更多信息,请访问 供应商的网站.
cve - 2021 - 31869: Pimcore AdminBundle 'specificID' SQL注入
发送到' /admin/object/grid-proxy '的请求由' Bundles/AdminBundle/Controller/ admin/ DataObject/DataObjectController处理.Php’文件,从第1568行开始,如下所示:
这个文件收集所有参数(第1586行), 然后在调用' prepareListingForGrid '时包含如下所示的参数:
' prepareListingForGrid '在前面提到的' Pimcore/Bundles/AdminBundle/Helper/GridHelperService '中找到.Php '文件,从第489行开始. 该函数根据提供的参数构建SQL查询. 参数“specificID”容易受到SQL注入的攻击, 因为' specificId '参数数据直接连接到字符串中,然后添加到' $conditionFilters '数组中, 如下图所示:
对“grid-proxy”url的请求如下所示. 在这个查询中,' specificId '字段被设置为' 1+或+ ' a ' = ' a ' '. 响应显示的内容长度为7546.
GET / admin /对象/ grid-proxy / classId = b&(其他参数)&specificId = 1 +或+ ' a ' = ' a '&query=(其他参数) HTTP/1.1
下一个请求将' specificId '参数设置为' 1+或' a ' = ' b ' '. 如下图所示,响应长度现在是47,没有返回任何记录.
通过结合这两个请求, 恶意行为者可以通过测试每个字符并监视响应,以编程方式从数据库返回数据. 下面的图片通过请求数据库版本并检查版本的第一个字符是否等于8来显示这个示例.
Akaunting v2.1.12(6期)
会计核算是企业的一项会计制度, 提供与日常业务正常运作相关的各种服务, 尤其是在零售业, 例如发票和费用跟踪. 更多关于会计的信息可以在 供应商的网站.
cve - 2021 - 36800:审计操作系统命令注入
会计应用程序允许发送到应用程序的PHP代码由web服务器执行. 这可能导致直接在主机操作系统上创建一个shell. 这个漏洞是在“钱”的创造中引入的.Php '文件在第一次提交,1c01d2120941d99f758cf23be20fe5931bdd4a36. 要利用此漏洞, 攻击者必须首先经过身份验证,并且已经拥有添加或修改销售发票的权限.
POST发送到' /{company_id}/sales/invoices/{invoice_id} '与' items[0][price] ',其中包括一个PHP可调用函数直接执行. 下图显示了帖子主体,其中' items[0][price] '设置为' phpinfo '. 右边的响应显示了响应, 其中包括应用程序执行' phpinfo() '的结果:
这是由于在货币方面缺乏投入消毒.PHP中间件组件. The following is the code responsible for the execution; as shown, 它检查接收到的内容是否可调用, 如果是这样的话, 执行它.
保护函数parseAmountFromCallable($amount)
{
if (!is_callable金额($)){
返回$金额;
}
返回美元金额();
}
cve - 2021 - 36801:公司选择中的会计认证绕过
用户可以更改与其帐户相关联的公司, 允许他们查看/修改来自另一家公司的信息. 这个漏洞是在应用程序的第一次提交中引入的. 要利用此漏洞,攻击者必须首先以任何用户身份进行身份验证.
第一张图显示用户' Test_company_1 '与名为' My company '的公司相关联:
在登录用户' Test_company_1 '时,我们点击' Profile '来更改用户设置:
通过点击“保存”按钮并拦截请求, 我们可以将' companies[0] '字段修改为另一家公司的' id '. 下图是在更新个人资料信息的同时,将公司信息从1更改为2:
完成后,查看仪表板将显示关联公司已更改:
cve - 2021 - 36802:通过用户控制的“locale”变量计算DoS
任何用户都可能通过在格式良好的HTTP POST请求中提供无效的'locale'变量而导致akaunts平台崩溃. 这个漏洞是在应用程序的第一次提交中引入的. 要利用此漏洞,攻击者必须首先以任何用户身份进行身份验证.
下图显示了发送到' /2/settings/settings '的帖子,其中包含无效的区域设置,已成功处理,没有错误:
访问任何页面都会得到500的响应:
cve - 2021 - 36803: accounting Avatar Persistent XSS
用户可以在头像上传过程中注入HTML,并为任何查看头像的人触发XSS, 包括应用程序的高权限管理员. 这个漏洞是在应用程序的第一次提交中引入的. 要利用此漏洞,攻击者必须首先以任何用户身份进行身份验证.
下图显示了一个发送到' /{company_id}/auth/users/{user_id} '的帖子,在图片上传字段中嵌入了HTML:
例有效载荷:
```
-----------------------------11088376342107705763341750165
Content-Disposition: form-data; name="picture"; filename="Screenshot_2021-05-02_05_11_16.png”
内容类型:图像/ png
test
```
The HTML is directly rendered on screen while accessing the avatar URL; e.g / {company_id} /上传/ {upload_id}:
cve - 2021 - 36804:会计密码重置中继
在发送Post到' /auth/ forget '端点时设置主机头会改变应用程序生成的链接. 攻击者可以为现有用户发送密码重置请求,并修改主机头指向他们控制的web服务器. 如果用户单击密码重置URL, 攻击者将收到密码重置令牌,然后可以将密码设置为攻击者知道的值. 这个漏洞是在应用程序的第一次提交中引入的. 要利用此漏洞, 攻击者必须首先知道或猜测一个有效用户的电子邮件地址.
下图显示了发送到/auth/ forget端点的帖子,其中Host设置为example.com:
应用程序发送的电子邮件将用户引导到示例.使用密码重置令牌的Com域.
请注意,这个漏洞的根源是由于Laravel框架中的设计决策,以及代理标头在单实例和多租户实现方面的处理方式. 换句话说, 而cve - 2021 - 36804是akaunts中的一个(现已修复)漏洞, 其他涉及Laravel的多租户实现应该意识到,该框架的默认配置可能容易受到类似问题的攻击. 有关此设计问题的更多信息,请参阅Enlightn's 主机注入分析仪丹尼尔·科尔伯恩的 推特, PR 5477 在Laravel GitHub存储库中.
cve - 2021 - 36805:会计发票页脚持久性XSS
akaaccounting应用程序允许将HTML写入销售发票的页脚,并依靠其内置的“防火墙”来防止恶意代码, 比如XSS, 不被接受. 下面的示例展示了特制的HTML代码如何绕过过滤. 这个漏洞是在应用程序的第一次提交中引入的. 要利用此漏洞, 攻击者必须具有添加或修改销售发票的权限.
POST发送到' /{company_id}/sales/invoices/{invoice_id} ',其中'页脚'包含以下HTML将执行javascript:
概念有效载荷证明:
POST /1/销售/发票/201.1 ... -----------------------------11766653461285783364827965738 Content-Disposition: form-data; name="footer" '\"
The payload bypasses the firewall restrictions because of the `>` placed in the class attribute. 下图显示了这个字符串是如何不匹配用于防止XSS的正则表达式的:
修复
对于所有这些问题, 更新到受影响的应用程序的最新版本将解决这些问题. 如果由于外部因素或习惯导致更新困难或不可能, 本地更改, 这些应用程序的用户可以通过不直接向Internet展示其生产实例来限制其暴露, 只将它们暴露给具有可信内部人员的可信内部网络.
另外, 因为这些应用程序是开源的, 用户可以直接联系这些项目,以获得将修复程序反向移植到自己的运行版本所需的任何帮助. 发现准确的代码更改的一种方法是查看固定版本和最近的版本之间的git差异, 对于任何熟悉编写这些应用程序的语言的人来说,这些修复应该是相当明显的. 一般来说,一旦知道了漏洞是什么,修复bug就相当简单了. 找到并证明bug是最困难的部分, 再次感谢维克多和特雷弗的工作.