HQL инъекция с Postgresql - PullRequest
       7

HQL инъекция с Postgresql

3 голосов
/ 16 января 2020

Я пытаюсь понять, как работают инъекции HQL, но мне нужна помощь. Я отправляю моему серверу запрос HTTP POST со следующим json:

{
    "status":"COMMUNICATION",
    "planning": {
    "from": "01-20-2013",
    "to": "11-12-2015"
    }
}

Я знаю, что можно ввести мошеннический запрос в конце параметра "status" потому что, когда я закрываюсь с простой цитатой (например: "status":"COMMUNICATION'"), сервер возвращает ошибку Hibernate с запросом:


{
    "exception": "org.springframework.dao.InvalidDataAccessApiUsageException", 
    "error": "Internal Server Error", 
    "message": "org.hibernate.QueryException: expecting ''', found '<EOF>' [SELECT com FROM com.company.CorRequest as com where com.corCommunicationId > 0 AND com.status = 'COMMUNICATION'' AND com.scheduledDate > to_timestamp('01-20-2013','MM-dd-yyyy HH24:MI') AND com.scheduledDate <= to_timestamp('11-12-2015','MM-dd-yyyy HH24:MI')]; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: expecting ''', found '<EOF>' [SELECT com FROM com as com where com.corCommunicationId > 0 AND com.status = 'COMMUNICATION'' AND com.scheduledDate > to_timestamp('01-20-2013','MM-dd-yyyy HH24:MI') AND com.scheduledDate <= to_timestamp('11-12-2015','MM-dd-yyyy HH24:MI')]", 
    "path": "/v1/comuni/", 
    "timestamp": 1579167902428, 
    "status": 500
}

Когда я вставляю "COMMUNICATION')--", я получаю весь назад, но я ничего не могу сделать, у тебя есть идеи?

1 Ответ

2 голосов
/ 26 января 2020

Инъекции всегда следуют одному и тому же пути атаки. Давайте рассмотрим основы.

  1. Отправка вредоносных данных в службу
  2. Служба помещает эти данные в некоторую структуру (XML, HTML, SQL, запрос LDAP, команда оболочки, et c ...)
  3. Если служба уязвима, вы можете выйти из области данных и изменить саму структуру, предоставив вам XML / HTML / SQL / LDAP / command, et c. инъекция

Для большого обзора инъекций прочитайте этот пост .

Глядя на ваш пример, вот что происходит.

  1. Вы отправляете COMMUNICATION)'-- как злонамеренный ввод
  2. Ваш сервис, используя HQL, создает запрос SQL, подобный следующему: SELECT com FROM com.company.CorRequest as com where com.corCommunicationId > 0 AND com.status = 'COMMUNICATION'--' AND ...
  3. Вы вышли из области данных com.status и смогли изменить структуру самого запроса, закомментировав все после com.status = COMMUNICATION

Вот почему вы получаете всю таблицу обратно.

Так как же вы извлечь данные из разных таблиц? Вот некоторые приемы, которые sqlmap поддерживает . Проще всего использовать UNION query-based инъекцию: отправьте UNION ALL SELECT xy FROM different_table в качестве вредоносного ввода, и вы сможете запросить different_table и извлечь данные.

Теперь, конечно, ваши настройки уникальны, и Я понятия не имею о коде, который работает вокруг запроса. Может случиться, что некоторые логики приложений c скрывают этот недостаток и делают его более трудным / невозможным для использования. Пример, который вы предоставили, должен быть PO C достаточно, чтобы гарантировать исправление. Я написал короткий пост о доверии входящим данным и мышлении, которое вы должны иметь вокруг него.

Если вы действительно хотите go постараться извлечь данные с помощью sqlmap, я рекомендуем взглянуть на документацию произвольной точки впрыска .

Исходя из предоставленной вами информации, точка впрыска будет выглядеть примерно так: COMMUNICATION)'*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...