免责声明:我是一名计算机程序员,不是安全分析师或任何与安全有关的人。我在密码学领域的经验为零,所以请多多包涵。
情况:我的任务是将客户的站点与数据托管站点集成。在处理这个问题时,我偶然发现了一个转储所有用户数据的查询。要进行此查询,用户必须“验证”以获取会话并使用该会话代码进行此查询,然后在完成查询和响应之前检查用户是否具有管理员权限。
但是……这对我来说似乎有点可怕。特别是因为这是在成功运行查询时发回的一些数据:
"username": "testemail@testemail.blerg",
"firstname": "Test",
"lastname": "Name",
"userpassword": "$1$te000000$qMpAriadAHuRyDkK58YKS0"
返回的数据更多是可怕的暴露,但这不是我主要关心的问题。
显然,从来没有人被命名为“测试名称”,并且“testemail.blerg”不是一个注册域,更不用说“blerg”是一个可能的顶级域。即使是这样,该帐户也已从数据托管站点中删除并且无法登录。使用的密码是一个弱密码,测试用例密码,并且没有被任何人使用。
我是否有可能使用暴力/彩虹表(虽然我没有经验,但我知道一些闪词:P)或从中获取密码的东西?我知道的一点(我认为)userpassword
是 MD5 盐的第一部分,但我什么都不知道。
如果有人能解释它是多么容易,我可以向我的老板证明这个网站非常糟糕,并说服我们的客户从这个数据托管网站迁移。
关于加盐,我确实知道更多(即它是如何获得盐的,它使用什么语言/功能等),但我想看看那些无法访问该信息的人是多么容易理解它出去。希望我还有另一件事可以去找我的老板。
编辑:由于法律/等原因,我故意在描述中含糊不清似乎有点混乱,部分是为了防止任何迹象表明这是哪个 CRM。我也意识到我称它为“数据托管”可能会产生误导,所以我的错。希望这可以澄清:
我们团队正在做的工作是为公司创建一个基本网站来展示他们的产品。我与 CRM 的唯一互动是:
- 当一个人填写了联系我们表格时,我们
POST
向 CRM 中的一个Contacts
对象提供了用户的信息。 - 做一个
GET
在销售他们产品的清单上Dealers
展示。
我从 #2(GET
API 调用)开始,在那里我发现我可以查询Users
表。我没有创建 API,我只是向它发出请求。
该GET
调用需要一个参数query=
,其中值是SELECT
系统查询语言中的语句,然后将其转换为 SQL(可能防止 SQLI 攻击,但我不知道它如何解释/转换为 SQL,所以我没有触及那个用一根 10 英尺长的杆子)。通过在查询中更改SELECT * FROM Dealers;
为SELECT * FROM Users;
,我能够看到每个用户的数据。
CRM 处理用户的方式是在其站点上使用门户。在门户中创建了一个用户,其中有一个“是管理员”复选框。这可以随时通过门户进行编辑。这是发出 API 请求的过程:
用户向包含用户名的 CRM 请求令牌。
该令牌与该用户的“秘密”访问密钥连接,生成的字符串经过 MD5 散列,然后发送回请求会话令牌。
这个会话令牌包含在每个请求中,作为查询字符串参数,以“验证”请求是否“授权”。
其中一个问题是,如果“管理员”用户向Users
表发出请求,则响应是每个用户的列表,其中包含我上面列出的信息以及用户的“秘密”访问令牌(和其他信息)。因此,这比仅仅暴露密码更糟糕,它实际上是通过冒充任何人来授予任何人访问权限。