LDAP简介

LDAP全称是Lightweight Directory Access Protocol,轻量目录访问协议。,LDAP是设计用来访问目录数据库的一个协议。windows中AD是微软对LDAP的实现,目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。这东西应该主要存在内网中。

结构:

dn(Distinguished Name) :一条记录的位置 ,比如上图,我们要想描述baby这个节点,描述如下
cn=baby,ou=marketing,ou=pepple,dc=mydomain,dc=org
dc(domain compoent) :一条记录所属区域 域名部分
ou (Organization Unit):一条记录所属组织
cn/uid(Common Name):一条记录的名字/ID
Entry:条目记录数

所有过滤器必须置于括号中,只有简化的逻辑操作符 (AND、OR、NOT)和关系操作符 (=、>=、<=、~=)可用于构造它们。特殊符“*”可用来替换过滤器中的一个或多个字符。

LDAP过滤器
Fileter = (filtercomp)
Filtercomp = and / or / not / item
And = & filterlist
Or = | filterlist
Not = ! filter
Filterlist = 1*filter
Item = simple / present / substring
Simple = “=” / “~=” / ”>=” / “<=”
Present = attr =*
Substring = attr “=” [initial]*[final]
Initial = assertion value
Final = assertion value
ldap 查询语法
search语法:attribute operator value
search filter options:( "&" or "|" (filter1) (filter2) (filter3) ...) ("!" (filter))

具体详解可见:ldap search语法

基础语法:

1. & 逻辑与
2. ! 逻辑非
3. * 统配符
ldap注入

ldap注入和sql注入差不多,但是没有sql注入那么多姿势。

例题

pentesterLab这个靶场还不错:

image.png

Example1:

返回:NOT AUTHENTICATED

google可以发现是连接ldap失败,一些LDAP服务器授权空绑定,如果用户密码为空,将继续绑定,所以只需传入空即可:

image.png

example2:

打开就会自动填充一个正确的用户密码:

image.png

接下来简单测试一下:

image.png

修改账号密码都会提示认证失败:

刚刚提到的通配符:*

image.png

但是测试密码使用通配符却不行!

看了下代码:

$ld = ldap_connect("localhost") or die("Could not connect to LDAP server");
ldap_set_option($ld, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ld, LDAP_OPT_REFERRALS, 0);
if ($ld) {
  $lb = @ldap_bind($ld, "cn=admin,dc=pentesterlab,dc=com", "pentesterlab");
  if ($lb) {
    $pass = "{MD5}".base64_encode(pack("H*",md5($_GET['password'])));
    $filter = "(&(cn=".$_GET['name'].")(userPassword=".$pass."))";
    if (!($search=@ldap_search($ld, "ou=people,dc=pentesterlab,dc=com", $filter))) {
      echo("Unable to search ldap server<br>");
      echo("msg:'".ldap_error($ld)."'</br>");
    } else {
      $number_returned = ldap_count_entries($ld,$search);
      $info = ldap_get_entries($ld, $search);
      if ($info["count"] < 1) {
        //NOK
        echo "UNAUTHENTICATED";
      }
      else {
        echo "AUTHENTICATED as";
        echo(" ".htmlentities($info[0]['uid'][0]));
      }
    }
  }
}

password是经过加密的,所以说这里失败了。

$filter = "(&(cn=".$_GET['name'].")(userPassword=".$pass."))";
if (!($search=@ldap_search($ld, "ou=people,dc=pentesterlab,dc=com", $filter)))

关键代码:

类似sql注入,首先闭合:

h*))%00&password=h1

%00注释掉后面的东西:

image.png

image.png

成功注入。

Last modification:December 15th, 2020 at 12:39 am