LDAP Инъекция (LDAP Injection) является методом нападения, используемым для эксплуатирования веб-сайтов, которые формируют LDAP операторы из потока входных данных от пользователей.
Lightweight Directory Access Protocol (LDAP) является стандартом открытого протокола и для выполнения запросов, и для управления сервисами X.500 директорий. LDAP протокол запускается поверх транспортного протокола, такого как TCP. Веб-проложения могут использовать поток входные данных от пользователя, чтобы формировать индивидуальные LDAP операторы для запросов динамических веб-страниц.
Когда веб-приложение недостаточно хорошо обрабатывают поток входных данных от пользователя, это дает возможность злоумышленнику изменить процесс формирования LDAP оператора. Когда злоумышленник в состоянии изменить LDAP оператор, процесс выполняться с такими же полномочиями, как и компонент, который выполняет команду (например, сервер БД, сервер Веб-приложения, Веб-сервер и т.д.). Это может стать причиной серьезных проблем безопасности, где полномочия предоставляют права для запросов, модификаций, или удаления чего-нибудь внутри LDAP дерева.
Некоторые расширенные технологии использования доступные для SQL Инъекции могут быть так же применены и в LDAP инъекции.
Пример.
Программные коды с проблемой в безопасности
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) + ")" ' поиск элементов пользователя
line 19:
line 20:
line 21: 'Создание LDAP объекта и установка базового 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: 'Установка поискового фильтра
line 27: ldapObj.SearchFilter = filter
line 28:
line 29: ldapObj.Search
line 30:
line 31: 'Отображение пользовательской информации
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 инициализируется параметром от пользователя, после этого по быстрому проверяется, есть ли хоть какое-нибудь значение в ней. И если значение есть, userName используется для инициализации переменной filter на строке 18. Эта новая переменная на прямую используется для составления LDAP запроса, который будет использоваться в вызове SearchFilter на строке 27. По данному сценарию, злоумышленник имеет полный контроль над тем, что будет запрашиваться на LDAP сервере, и он получит результат запроса, при выполнении программы между строками 32 и 40, где все результаты и их атрибуты выводятся обратно пользователю.
Пример атаки
http://example/ldapsearch.asp?user=*
В этом примере, мы посылаем символ *
в параметре user, который в результате в программе окажется в переменной filter, чтобы инициализироваться с (uid=*)
. Итоговый LDAP оператор заставит сервер вернуть все объекты, содержащие uid атрибут.
Нет комментариев