LDAP注入
- 漏洞简介
- LDAP语法
- 漏洞原理
- AND注入
- OR注入
- LDAP盲注
- 漏洞利用
- 漏洞防御
漏洞简介
轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP)。LDAP是一种通讯协议,LDAP支持TCP/IP。可以说LDAP类似于mysql数据库,用来存储目录。
LDAP就是一个类似于“目录服务”的特殊数据库,用来保存描述性的、基于属性的详细信息,支持过滤功能。它是动态的,灵活的,易扩展的。类似于:人员组织管理,电话簿,地址簿…等等。ldap 可能内网会多点,但也有很多开了外网的查询接口,默认的端口是 389,加密的端口是 636,信息搜集的时候也可以关注下。
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