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