LDAP注入

  • 漏洞简介
  • LDAP语法
  • 漏洞原理
  • AND注入
  • OR注入
  • LDAP盲注
  • 漏洞利用
  • 漏洞防御


漏洞简介

轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP)。LDAP是一种通讯协议,LDAP支持TCP/IP。可以说LDAP类似于mysql数据库,用来存储目录。

LDAP就是一个类似于“目录服务”的特殊数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能。它是动态的,灵活的,易扩展的。类似于:人员组织管理,电话簿,地址簿…等等。ldap 可能内网会多点,但也有很多开了外网的查询接口,默认的端口是 389加密的端口是 636,信息搜集的时候也可以关注下。

LDAP目录树形结构,存储在叶子节点上

ldap 同步端口 ldap服务端口_ldap 同步端口


dn标志一条记录,描述一条数据的详细路径(根)

dc表示一条记录所属区域,相当于数据库(表示一棵树)

ou表示一条记录所属组织(表示树的分支)

cn表示一条记录的名字,相当于数据库中的主键即需要查找的目标

位置表示dn:cn=xx,ou=xx,ou=xx,dc=xx 从树根到达目标的位置,可能要经过好几个树杈,所有ou可能有多个值

LDAP语法

=(等于)

此 LDAP 参数表明某个属性等于某个值的条件得到满足。例如,如果希望查找“名“属性为“John”的所有对象,可以使用:(givenName=John) 这会返回“名”属性为“John”的所有对象。圆括号是必需的,以便强调 LDAP 语句的开始和结束

&(逻辑与)

如果具有多个条件并且希望全部条件都得到满足,则可使用此语法。例如,如果希望查找居住在 Dallas 并且“名”为“John”的所有人员,可以使用:(&(givenName=John)(l=Dallas))

请注意,每个参数都被属于其自己的圆括号括起来。整个 LDAP 语句必须包括在一对主圆括号中。操作符 & 表明,只有每个参数都为真,才会将此筛选条件应用到要查询的对象。

!(逻辑非)

此操作符用来排除具有特定属性的对象。假定您需要查找“名”为“John”的对象以外的所有对象。则应使用如下语句:(!givenName=John)

此语句将查找“名”不为“John”的所有对象。请注意:! 操作符紧邻参数的前面,并且位于参数的圆括号内。由于本语句只有一个参数,因此使用圆括号将其括起以示说明。

• *(通配符)

可使用通配符表示值可以等于任何值。使用它的情况可能是:您希望查找具有职务头衔的所有对象。为此,可以使用:(title=*)

这会返回“title”属性包含内容的所有对象。另一个例子是:您知道某个对象的“名”属性的开头两个字母是“Jo”。那么,可以使用如下语法进行查找:(givenName=Jo*)

这会返回“名”以“Jo”开头的所有对象。

漏洞原理

LDAP具有特定的查询结构,并具有特定的语法,来对特定目录进行遍历,LDAP注入攻击和SQL注入攻击类似,利用用户引入的参数生成LDAP查询,由于部分参数没有适当的过滤,因此攻击者可以注入恶意代码以造城恶意攻击

AND注入

构造由&操作符和用户引入的的参数组成的正常查询在LDAP目录中搜索

  • 绕过访问控制
    构造(&(USER= Uname)(&)(PASSWORD=Pwd)),LDAP服务器只处理第一个过滤器,即仅查询(&(USER=slidberger)(&))得到了处理。 这个查询永真,因而攻击者无需有效地密码就能获取对系统的访问。成功绕过
  • 权限提升
    现假设下面的查询会向用户列举出所有可见的低安全等级文档:(&(directory=document)(security_level=low))
    构造类似(&(directory=documents)(security_level=*))(&(direcroty=documents)(security_level=low))的查询
    这里第一个参数document是用户入口,low是第二个参数的值。如果攻击者想列举出所有可见的高安全等级的文档,可以利用如下的注入:document)(security_level=*))(&(directory=documents LDAP服务器仅会处理第一个过滤器而忽略第二个,结果就是,所有安全等级的可用文档都会列举给攻击者

OR注入

构造由|操作符和用户引入的的参数组成的正常查询在LDAP目录中搜索,例如:(|(parameter1=value1)(parameter2=value2)) 这里Value1和value2是在LDAP目录中搜索的值,攻击者可以注入代码,维持正确的过滤器结构但能使用查询实现目标。

具体的注入方式和AND差不太多,不予详述。

LDAP盲注

LDAP盲注技术让攻击者使用基于TRUE/FALSE的技术访问所有的信息。

  • AND盲注
    输入要查询的东西,有则返回图标;无则没有返回
  • OR盲注
    输入要查询的东西,如果有则不返回图标;如果不存在,返回存在的图标
  • 深入学习
    攻击者可以使用字母、数字搜索提取属性的值,这个想法的关键在于将一个复杂的值转化为TRUE/FALSE列表。
    假设攻击者想知道department属性的值,处理如下:
    (&(idprinter=HPLaserJet2100)(department=a*))(object=printer))(&(idprinter=HPLaserJet2100)(department=f*))(object=printer))(&(idprinter=HPLaserJet2100)(department=fa*))(object=printer))如此根据返回的不同结果猜解是否正确,和MYSQL盲注类似。
    同样,攻击者可以使用字符集削减技术减少获得信息所需的请求数,为完成这一点,他使用通配符测试给定的字符在值中是否为anywhere:
    (&(idprinter=HPLaserJet2100)(department=*b*))(object=printer))(&(idprinter=HPLaserJet2100)(department=*n*))(object=printer))这样子可以看department中是否有b和n,巧用可以加速猜解过程,当然一般肯定都是写脚本猜解

漏洞利用

bWAPP——LDAP Connection Settings

漏洞防御

始终使用框架提供的功能来进行正确的验证,过滤或转义用户输入的数据;

不允许用户指定客户端的属性值。使用可由用户指定的存储值或服务器端功能。

更好地格式化查询语句,以防止被恶意修改。

参考博客:
https://www.fujieace.com/jingyan/ldap.htmlhttps://www.freebuf.com/company-information/189869.html