[Day14] LDAP Injection

前言

Injection +1 ↑

正文

概念

LDAP全称Lightweight Directory Access Protoco,轻量目录访问协定。LDAP是一个提供Access Control和分散式资讯维护的目录资讯。

LDAP Injection与SQL Injection和ORM Injection有点相似,不一样的是,LDAP是利用用户参数来产生的LDAP查询。

跟常见的测试方法相似,利用输入一些会让LDAP混淆的无意义字元,若LDAP Server return错误讯息,就可能代表这可能具有漏洞。

例如原本的User为Craig,我们可以输入诸如(,),&,|,*,!等等,更改原本的查询动作。
若有一个php网站,部分程序码如:

$userName = $_POST["userName"];
$filter = "(user=" . $userName . ")";
$output = ldap_search($ds, "ou=People,dc=example,dc=com", $filter);

而若是在这种不经检查的状况下,对userName的input输入:
Craig, Chen)(|(objectclass=*)
将会将原本的查询:
(user=Craig, Chen)
变成
user=Craig, Chen)(|objectclass=*)
这会让filter根据|(objectclass=*)这个条件,与目录中的所有项目相符合,导致攻击者可以leak出整个使用者集区的资讯。

或是利用类似於SQL injection中的'OR "1"="1" --,bypass登入验证。
假设有个使用LDAP的网站具有使用者登入的功能参数为userpass
这时候我们在input中写入一个让条件始终为true的输入:
*)user=*))(|user=*
就可以在完全没有用户帐号和密码的状况下获得网站的用户权限。

Case Study

CVE-2021-29156

研究员在ForgeRock的OpenAM Server里发现具有漏洞的webfinger endpoint。

String[] objs = { filter };
String FILTER_PATTERN_ORG = "(&(objectclass="
  + SMSEntry.OC_REALM_SERVICE + ")(" + SMSEntry.ORGANIZATION_RDN
  + "={0}))";
String sfilter = MessageFormat.format(FILTER_PATTERN_ORG, (Object[]) objs);

可以看的出来这是一个使用JAVA进行的LDAP查询,应用程序没有对上述所提过的特殊字元进行检查、转义或过滤,这使攻击者可以撰写自动化程序码,去Enum有效的使用者名称(帐号)
http://example/cra*&...(後略)
若是服务器中具有cra开头的用户名称,就会return 200 OK,无则404 Not Found。
在取得用户名称後,再利用密码输入的地方,如同前述一样慢慢破解使用者密码的hash,例如:
pass=a*
pass=b*
若return 200则继续下一个字元的判断,以此try出user passowrd的hash value。


<<:  LeetCode解题 Day29

>>:  (Day29) ES6 - 解构赋值

Day 20: SOLID 设计原则 — ISP (待改进中... )

「一般来说,如果你所依赖的模组包含了超过你所需要的,那就是有害的,这可能导致不必要的重新编译和重新...

未来流通产业情报站,资料团队分工厘清

每一次的重要决策,都左右着後面的行为发展,非常棒的产业蓝图关键链 跨足零售产业,电商产业,物流产业,...

从内建容器到善用资料结构特性

题组回顾与观念统整 在前三天的刷题实战中,我们一起完成了这三个经典的「基本」题: LeetCode...

Day 5 Tableview小实作2

继续昨天 我们回到新建的tableviewcontroller,写一个变数阵列。 这边是介绍一些比较...

Day 24:作品集

前言 这个市场想要找工作的准工程师非常多,我们要证明自己除了学科(考题、技术问答)以外,更重要的是证...