Меню
Назад » »

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

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

Атаки этого типа направлены на веб‑серверы, создающие запросы к службе LDAP на основе данных, вводимых пользователем. Упрощенный протокол доступа к службе каталога (Lightweight Directory Access Protocol, LDAP) – открытый протокол для создания запросов и управления службами каталога, совместимыми со стандартом X.500. Протокол LDAP работает поверх транспортных протоколов Интернет (TCP/UDP). Веб‑приложение может использовать данные, предоставленные пользователем для создания запросов по протоколу LDAP при генерации динамических веб‑страниц. Если информация, полученная от клиента, должным образом не верифицируется, атакующий получает возможность модифицировать LDAP‑запрос. Причем запрос будет выполняться с тем же уровнем привилегий, с каким работает компонент приложения, выполняющий запрос (сервер СУБД, веб‑сервер и т. д.). Если данный компонент имеет права на чтение или модификацию данных в структуре каталога, злоумышленник получает те же возможности. В листинге 1.11 представлен пример кода, который может быть подвержен атаке данного вида.

Листинг 1.11. Уязвимый код с комментариями

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).
Никто не решился оставить свой комментарий.
Будь-те первым, поделитесь мнением с остальными.
avatar