Expression Language Injection

В списке уязвимостей, связанных с различного рода инъекциями (SQL, LDAP, XPath, etc) появилось новое наименование – Expression Language Injection. Новая разновидность инъекций описана в свежем исследовании Стефано ди Паолы (Stefano Di Paola) и Аршана Дабирсиаги (Arshan Dabirsiaghi). Уязвимость затрагивает JSP-приложения, написанные с использованием популярного в этой среде фреймворка Spring MVC. В результате успешной атаки EL Injection может привести к утечке данных как со стороны сервера (пути, значения глобальных переменных, etc), так и пользователя (обход httpOnly, получение идентификаторов сессий). Уязвимость возможна в том случае, когда внутри JSP-тэгов фреймворка Spring используется Expression Language – скриптовый язык, позволяющий получить доступ к Java-компонентам из JSP:

<spring:message scope=”${param.foo}”/>

В чем заключается уязвимость?
Дело в том, что в Spring MVC выражения Expression Language внутри определенных атрибутов выполняются дважды, поэтому, приложение, получающее входящие данные посредством Expression Language как в примере выше, уязвимо к внедрению произвольных EL-выражений.

Expression Language Injection отлично поддается фаззингу. Проверить приложение на уязвимость можно, отправляя EL-выражения и проверяя на выходе результат их выполнения, например значение параметра ${9999+1} – поиск в ответе 10000. Другим способом является отправка некорректных конструкций Expression Language и проверка строк, свидетельствующих об ошибке:

Parsing of JSP EL expression “${${2*2}” failed

К чему может привести El Injection?

  • раскрытие путей в содержании результата выполнения ${applicationScope}:


    {org.apache.catalina.jsp_classpath=/
    home/arshan/ELInjection/target/
    ELInjection/WEB-INF/classes/:/
    home/arshan/ELInjection/target/
    ELInjection/WEB-INF/lib/aopalliance- 1.0.jar:/home/arshan/ELInjection/
    target/ELInjection/WEB-INF/lib/
    commons-logging-1.1.1.jar

    javax.servlet.context.tempdir=/ home/arshan/ELInjection/target/ tomcat/work/localEngine/localhost/ELInjection
    }

  • раскрытие данных приложения: строки подключения к базе данных, конфиденциальная информация в результатах SQL-запросов, другие серверные переменные;
  • обход httpOnly – вывод в тело html-документа cookie, защищенных параметром httpOnly:

    http:///vulnerable.com/spring/foo?param=${cookie[“JSESSIONID”].value}

Благодаря тернарному оператору (expr1?expr2:expr3), Expression Language Injection может быть реализована “слепым” методом. Как и при SQL-инъекциях, данные можно получить последовательным перебором по алфавиту или с использованием бинарного поиска. Пример реализации Blind EL Injection доступен здесь (удаленно извлекается JSESSIONID с помощью кросс-доменных запросов).

Как защититься?
Авторы исследования предлагают решить проблему радикально, отключив Expression Language:

<%@ page isELIgnored ="true" %>

Разумеется, более предпочтительным вариантом является фильтрация входящих данных: для этого необходимо проводить проверку на наличие строк ${ и #{. В настоящий момент уязвимость в Spring MVC устранена.


2 comments:

  1. M4g, 18. September 2011, 22:49

    не хочешь случайно написать в журнал об этом статью?

     
  2. Raz0r, 19. September 2011, 10:39

    извини, думаю, нет.

     

Write a comment: