1

作为身份验证过程的一部分,我们System.DirectoryServices.DirectoryEntry根据用户输入的用户名和密码构建一个:

    var de = new DirectoryEntry(ldapPathFromConfig, typedUserName, typedPassword, AuthenticationTypes.ReadonlyServer|AuthenticationTypes.Secure);

但是当我们通过Checkmarx运行代码时,它声称存在“LDAP 注入”漏洞typedUserNametypedPassword因为它们没有经过清理。我不明白为什么,因为根据定义,密码可以是任何东西......而且使用的构造函数显然是为了接受一个usernamepassword作为第二个和第三个参数。

4

2 回答 2

0

我有一个与原始帖子类似的问题。我的研究似乎表明应该转义文本密码。以下是 RFC 4511 ( https://tools.ietf.org/search/rfc4511#section-4.2 ) 中的相关段落:

 Textual passwords (consisting of a character sequence with a known
 character set and encoding) transferred to the server using the
 simple AuthenticationChoice SHALL be transferred as UTF-8 [RFC3629]
 encoded [Unicode].  Prior to transfer, clients SHOULD prepare text
 passwords as "query" strings by applying the SASLprep [RFC4013]
 profile of the stringprep [RFC3454] algorithm.  Passwords
 consisting of other data (such as random octets) MUST NOT be
 altered.  The determination of whether a password is textual is a
 local client matter.

请注意,它声明“客户端应将文本密码准备为“查询”字符串”并参考其他标准来定义如何。

于 2021-11-05T03:25:33.407 回答
0

对于 Checkmarx,您应该始终清理(验证)您使用的每个值。如果你不这样做,Checkmarx 会认为它是不受信任的,顺便说一下,Checkmarx 的规则可能会导致一些注入。就您而言,这是 Checkmarx 的正常发现。

LDAP 注入很常见,就像 SQL 注入一样,而且我记得,没有像 LDAP 参数化这样的解决方案(参见https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html)。

于 2019-12-05T13:25:48.013 回答