Ldap注入

0-前言

​ 工作的时候看到了一个特殊的过滤表达式:(&(objectClass=user)),虽然这个功能并没有起作用,但为了防止下次遇到想不起,还是记录一下;学习文章LDAP注入与防御剖析 - test_user从一次漏洞挖掘入门Ldap注入Web漏洞那些事儿:LDAP注入 ldap过滤条件语法 等等

​ 因为主要的作用在于过滤,所以不像sql注入、表达式注入那样直接危害系统,但是会根据执行过滤的这个主机的权限导致一些泄露问题。

1-基本语法

需求 LDAP 过滤器示例
所有用户对象 (&(objectCategory=person)(objectClass=user))
所有计算机对象 (objectCategory=computer)
没有描述的计算机对象 (&(objectCategory=computer)(!(description=*)))
有描述的组对象 (&(objectCategory=group)(description=*))
cn 以 “Joe” 开头的用户 (&(objectCategory=person)(objectClass=user)(cn=Joe*))
电话号码格式为 (xxx) xxx-xxx (telephoneNumber=(*)*-*)
同时具有名(givenName)和姓(sn)的用户 (&(objectCategory=person)(objectClass=user)(givenName=*)(sn=*))
sAMAccountName 以 “x”、”y” 或 “z” 开头的对象 (sAMAccountName>=x)
sAMAccountName 以 “a” 或数字/符号开头(排除 “$”) (&(sAMAccountName<=a)(!(sAMAccountName=$*)))
cn 等于当前用户且属于指定组(sales) (&(cn=%(user)s)(memberOf=CN=sales,OU=east,DC=test,DC=com))
排除禁用用户(只保留启用用户) `(!(&(cn=%(user)s)(

2-可能存在漏洞的点

危害类型 描述 攻击场景(基于文章案例)
1. 绕过访问控制 无需有效凭证即可登录系统或访问受限资源。 登录时,构造用户名 test_user)(&),使查询过滤器变为 (&(USER= test_user)(&))(PASSWORD=任意密码)。服务器只处理永真的 (&(USER= test_user)(&)) 部分,从而绕过密码验证。
2. 权限提升 获取本无权访问的高权限数据或功能。 在查看文档的查询中,注入 document)(security_level=*))(&(directory=documents。原查询意图是只查 low 等级文档,注入后实际执行的过滤器变为 (&(directory=documents)(security_level=*)),导致返回所有安全等级的文档。
3. 信息泄露 获取目录服务中存储的非授权敏感信息(如用户对象、其他资源)。 在查看打印机、扫描器等资源的查询中,注入 printer)(uid=*,使原OR过滤器 `(
4. 盲注提取数据 在应用不返回详细错误时,通过布尔逻辑逐字符推断目录结构、属性名及属性值。 1. 发现属性:注入 (&(idprinter=设备001)(departments=*)),根据页面是否有打印机图标,判断 departments 属性是否存在。 2. 提取值:通过注入 (&(idprinter=设备001)(department=f*))(&(idprinter=设备001)(department=fi*)) 等,利用布尔化(Booleanization)技术,可逐字母推断出属性值(如 financial)。

3-防御

核心防御原则

  1. 输入验证与净化:对所有来自客户端的、用于构造LDAP过滤器的变量,必须应用上述转义函数。
  2. 白名单验证:如果参数值预期来自一个有限的集合(如类型代码、状态值),应优先使用白名单进行验证,拒绝任何非预期值。
  3. 最小权限原则:用于连接LDAP目录的账户应遵循最小权限原则,仅授予其执行必要查询所需的最低权限,以限制攻击成功后的影响范围。