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