Рубрики
Без рубрики

Обработка инъекционных атак в Java

Инъекционная атака – это вставка вредоносных данных из клиента в приложение с использованием SQL o… Помеченный как java, инъекция, sql-инъекция, xxeinjection.

Инъекционная атака – это вставка вредоносных данных из клиента в приложение с использованием SQL или XXE (XML External Entity). Важно предотвращать инъекционные атаки, поскольку это позволяет злоумышленникам подделывать идентификационные данные, изменять существующие данные, раскрывать все данные, уничтожать данные, становиться администратором и т.д.

Если злоумышленник вводит что-то вроде ‘ или — приложение может отображать данные из базы данных:

Недостаток заключается в том, что поле (имя учетной записи) объединено с инструкцией SQL:

String query = "SELECT * FROM user_data WHERE last_name = '" + accountName + "'";

Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                        ResultSet.CONCUR_READ_ONLY);
ResultSet results = statement.executeQuery(query);

Чтобы исправить этот недостаток, вы должны использовать Неизменяемые запросы, Статические запросы, Параметризованные запросы или Хранимые процедуры. Для предыдущего примера лучшим решением является параметризованный запрос:

final String query = "SELECT * FROM user_data WHERE last_name = ?";

try {
  PreparedStatement statement = connection.prepareStatement(query,
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
  statement.setString(1, accountName);
  ResultSet results = statement.executeQuery(query);
  ...
} catch (SQLException sqle) {
  ...
}

Теперь, если вы попытаетесь ввести SQL, вы получите исключение.

Если у вас есть служба, которая получает XML, кто-то может изменить этот XML (с помощью Burp Suite), чтобы получить доступ к локальным ресурсам, удаленно выполнить код, раскрыть файлы или выполнить DoS-атаку ( используя атаку на миллиард смехов ).

Вы можете сказать: “Не беспокойтесь, я использую JSON в своих службах REST”. Однако злоумышленник может изменить тип содержимого тела запроса и отправить тот же XML-файл. Например, далее у нас есть запрос службы, перехваченный Burp Suite (многоточие используется для пропуска нерелевантной информации):

...
Content-Type: application/json
...

{"text":"test"}

Это так же просто, как изменить тип содержимого на XML и полезную нагрузку для выполнения атаки:

...
Content-Type: application/xml
...




  
]>

  &xxe

Этот сервис используется для размещения комментария, но теперь мы разместили каталог сервера:

После нескольких попыток вы можете распечатать содержимое важного файла (например, пароли или конфигурации).

Вы можете проверить входные данные, тип содержимого или указать своему анализатору игнорировать DTD (определение типа документа). Смотрите вызов setProperty:

protected Comment parseXml(String xml) throws Exception {
  JAXBContext jc = JAXBContext.newInstance(Comment.class);

  XMLInputFactory xif = XMLInputFactory.newFactory();
  xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);

  XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(XML));

  Unmarshaller unmarshaller = jc.createUnmarshaller();
  return (Comment) unmarshaller.unmarshal(xsr);
}

Для служб Spring REST вы можете указать. APPLICATION_JSON_VALUE:

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public AttackResult createNewUser(@RequestBody String commentStr, @RequestHeader("Content-Type") String contentType) throws Exception {
        ...
}

Теперь злоумышленник не может отправить XML:

Для получения дополнительной информации см.: https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html

Оригинал: “https://dev.to/eidher/handling-injection-attacks-in-java-2d1l”