Внедрение операторов LDAP (LDAP Injection)

Опубликовано в Безопасность, Безопасность веб-серверов

Внедрение операторов LDAP (LDAP Injection). Атаки этого типа направлены на вебсерверы, создающие запросы к службе LDAP на основе данных, вводимых пользователем.

Внедрение операторов LDAP (LDAP Injection)

Упрощенный протокол доступа к службе каталога (Lightweight Directory Access Protocol, LDAP) – открытый протокол для создания запросов и управления службами каталога, совместимыми со стандартом X.500. Протокол LDAP работает поверх транспортных протоколов Интернет (TCP/UDP). Веб-приложение может использовать данные, предоставленные пользователем для создания запросов по протоколу LDAP при генерации динамических веб-страниц. Если информация, полученная от клиента, должным образом не верифицируется, атакующий получает возможность модифицировать 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) + «)» " 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-12). Если в переменной содержится какое-то значение, оно используется для инициализации переменной filter (строка 18). Полученное значение используется для построения запроса к службе LDAP (строка 27), который исполняется в строке 29. В приведенном примере атакующий имеет полный контроль над запросом и получает его результаты от сервера (строки 32-40).