Статьи [Перевод] Инъекции в Ldap

Discussion in 'Статьи' started by NeMiNeM, 9 Nov 2007.

  1. NeMiNeM

    NeMiNeM Elder - Старейшина

    Joined:
    22 Aug 2005
    Messages:
    480
    Likes Received:
    310
    Reputations:
    201
    Инъекции в LDAP


    Автор: ka0x
    Контакты: ka0x01[!]gmail.com
    D.O.M TEAM 2007

    Перевод: NeMiNeM
    antichat.ru

    - Вступление
    - Фильтры LDAP
    - Инъекции в LDAP в сетевых-приложениях
    - Ссылки



    [Вступление]

    Техника LDAP (Lightweight Directory Access Protocol или Облегченный (упрощенный) протокол доступа к [сетевым] каталогам) представляет собой упрощенную версию ориентированного на соединение протокола DAP из набора стандартов X.500. Этот протокол работает через TCP/IP. Протокол доступа LDAP используется для запросов и модификации объектов.

    [Фильтры LDAP]

    Достаточно важно понять как работают фильтры в LDAP:

    FC 4515 (6/2006) (http://tools.ietf.org/html/rfc4515)

    Filter = ( filtercomp )
    Filtercomp = and / or / not / item
    And = & filterlist
    Or = | filterlist
    Not = ! filter
    Filterlist = 1*filter
    Item = simple / present / substring
    Simple = attr filtertype assertionvalue
    Filtertype = "=" /"~="/ ">=" / "<="
    Present = attr = *
    Substring = attr "=" [initial] * [final]
    Initial = assertionvalue
    Final = assertionvalue

    Логические операторы:

    - AND "&"
    - OR "|"
    - NOT "!"

    Реляционные операторы:

    <=, >=, =, ~=

    Специальный символ "*" используется для замены символов.

    Пример фильтра:

    (&(objectClass=user)(uid=*)):

    Возвращает список всех объектов класса user, в независимости от значения атрибута "uid".

    [Инъекции в LDAP в сетевых-приложениях]


    Инъекции в LDAP очень похожи на SQL инъекции. Атака на сервер производится с помощью команд пользователя.

    Пример уязвимого кода с комментариями Sacha Faust.

    HTML:
    line 0: <html>
    line 1: <body>
    line 2: <%@ Language=VBScript %>
    line 3: <%
    line 4:     Dim userName
    line 5:     Dim filter
    line 6:     Dim ldapObj
    line 7:
    line 8:     Const LDAP_SERVER = "ldap.example"
    line 9:
    line 10:     userName = Request.QueryString("user")
    line 11:
    line 12:     if( userName = "" ) then
    line 13:         Response.Write("<b>Invalid request. Please specify a valid user name</b><br>")
    line 14:         Response.End()
    line 15:     end if
    line 16:
    line 17:
    line 18:     filter = "(uid=" + CStr(userName) + ")"        ' searching for the user entry
    line 19:
    line 20:
    line 21:     'Creating the LDAP object and setting the base dn
    line 22:     Set ldapObj = Server.CreateObject("IPWorksASP.LDAP")
    line 23:     ldapObj.ServerName = LDAP_SERVER
    line 24:     ldapObj.DN = "ou=people,dc=spilab,dc=com"
    line 25:
    line 26:     'Setting the search filter
    line 27:     ldapObj.SearchFilter = filter
    line 28:
    line 29:     ldapObj.Search
    line 30:
    line 31:     'Showing the user information
    line 32:     While ldapObj.NextResult = 1
    line 33:         Response.Write("<p>")
    line 34:
    line 35:         Response.Write("<b><u>User information for : " + ldapObj.AttrValue(0) + "</u></b><br>")
    line 36:         For i = 0 To ldapObj.AttrCount -1
    line 37:             Response.Write("<b>" + ldapObj.AttrType(i) + "</b> : " + ldapObj.AttrValue(i) + "<br>" )
    line 38:         Next
    line 39:         Response.Write("</p>")
    line 40:     Wend
    line 41: %>
    line 42: </body>
    line 43: </html>
    
    Обратите внимание, в 10 строке переменная userName инициализируется с значением параметра user и сразу проверяется на валидность. Если значение не 0, то переменная userName переходит к фильтру в строке 18. Эта новая переменная используется для создания поиска LDAP и последственного вызова SearchFilter в строке 27.

    Взломщик имеет полный контроль над действиями такого сервера.
    Вы получите результат, когда исполнение кода достигнет строк 32-40.


    Пример 1:
    http://website/ldap.asp?user=*

    В этом примере символ "*" - это параметр для значения "user", которое заканчивается в фильтре переменной.

    Эта команда в LDAP покажет вам любой объект, который имеет атрибут uid.

    Мы увидим на екране всех пользователей и информацию о них.

    Пример 2:

    http://website/ldap.asp?user=ka0x)(|(homedirectory=*)

    Это покажет нам путь к пользователю ka0x. Перед уходом, можно поэксперементировать с кодом.

    [Ссылки]


    На оригинал - http://www.milw0rm.com/papers/183

    http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol
    http://es.wikipedia.org/wiki/LDAP
    http://www.ldapman.org/

    Для antichat.ru

    ps: В статье/переводе возможны ошибки. Просьба не кричать, а спокойно указать и исправить. Спасибо.
     
    #1 NeMiNeM, 9 Nov 2007
    Last edited: 11 Nov 2007
    3 people like this.