PDA

Просмотр полной версии : [Перевод] Инъекции в Ldap


NeMiNeM
10.11.2007, 00:53
Инъекции в 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.

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: В статье/переводе возможны ошибки. Просьба не кричать, а спокойно указать и исправить. Спасибо.