Руководство по защите от инъекций SQL в Mybatis Framework

Java


предисловие

Уязвимость SQL-инъекций — одна из самых распространенных уязвимостей в WEB-безопасности.С использованием прекомпиляции и различных ORM-фреймворков в java проблем с инъекциями становится все меньше и меньше. Начинающие аудиторы кода часто боятся сочетания нескольких фреймворков для веб-приложений Java и не знают, с чего начать.Они надеются, что проблема внедрения SQL, вызванная неправильным использованием фреймворка Mybatis, может быть использована в качестве примера для новичков. некоторые идеи.

1. SQL-инъекция Mybatis

Оператор SQL Mybatis может быть написан методом класса на основе аннотации, и больше записывается в файл xml способом xml. Операторы SQL в Mybatis должны быть написаны вручную или автоматически сгенерированы генератором. При записи xml-файлов MyBatis поддерживает два символа параметра: # и $. Например:

<select id="queryAll"  resultMap="resultMap">
  SELECT * FROM NEWS WHERE ID = #{id}
</select>

#Используйте предварительную компиляцию, $ используйте составной SQL.

Ситуации, которые подвержены уязвимостям SQL-инъекций в среде Mybatis, в основном делятся на следующие три типа:

1. Нечеткий запрос

Select * from news where title like ‘%#{title}%’

В этом случае использование программы # сообщит об ошибке, а начинающий программист изменит # на $, поэтому, если уровень java-кода не обрабатывает пользовательский ввод, это неизбежно приведет к уязвимостям SQL-инъекций.

Правильное написание:

select * from news where tile like concat(‘%’,#{title}, ‘%’)

2. Несколько параметров после ввода

Использование # при запросе нескольких идентификаторов после in также сообщит об ошибке,

Select * from news where id in (#{ids})

Правильное использование - использовать foreach вместо замены # на $

<foreach collection="ids" item="item" open="("separatosr="," close=")">
#{ids} 
</foreach>

3. После заказа

Этот сценарий следует отображать на уровне Java, настраивать массив имен полей/таблиц и разрешать пользователям передавать только значения индекса. Это гарантирует, что входящее имя поля или таблицы находится в белом списке. Следует отметить, что в операторе SQL, автоматически сгенерированном mybatis-generator, $ также используется для упорядочения по, и нет проблем с подобным и в.

2. Практические идеи

Мы используем cms с открытым исходным кодом для анализа.Проблема внедрения java sql подходит для обратного вывода.Сначала ищем xml, чтобы найти возможные уязвимости внедрения --> вернуться к DAO --> затем к классу реализации --> найти его через цепочка вызовов URL-адрес стойки регистрации, найдите точку использования, пойдем без разговоров

1, проект импорта идей

Домашняя страница идеи Нажмите «Получить из системы управления версиями» и введите https://gitee.com/mingSoft/MCMS.git.

Загрузка завершена, подождите, пока maven загрузит проект.

2. Найдите $keywords

Ctrl+shift+F, чтобы вызвать функцию «Найти в пути», отфильтровать суффикс xml и выполнить поиск $keywords.

По xml с Dao в имени файла это то, что нам нужно, берем для примера IContentDao.xml, открываем двойным кликом, ctrl+F поиск $, находим 16 первые три для выбора базы, пропускаем,

Продолжайте видеть подозрительный заказ, временно отложенный

Продолжайте смотреть вниз и найдите несколько общих сплайсов, что проще в использовании Давайте возьмем это в качестве примера, чтобы углубиться и найти только то, откуда пришли идентификаторы из внешнего интерфейса.

3. Поиск картографических объектов

Идентификатор select Mybatis соответствует имени объекта, который нужно сопоставить. Мы используем getSearchCount в качестве ключа для поиска сопоставленного объекта.

Я нашел IContentDao.java, IContentDaoimpl.java и McmsAction.java, которые соответствуют сопоставленному объекту, классу реализации объекта и внешнему контроллеру и переходят непосредственно к классу контроллера.

Выяснилось, что только идентификаторы категорий аналогичны идентификаторам целевых параметров и нуждаются в дальнейшем подтверждении. Вернитесь к IContentDao.java и продолжайте отталкивать в соответствии со стандартным потоком.

Найдите последний параметр с идентификаторами как getSearchCount, alt+f7, чтобы просмотреть цепочку вызовов

Перенесите в ContentBizImpl и подтвердите, что параметр переднего плана — categoryIds.

Возврат к McmsAction, параметры получает BasicUtil.getString,

Следите за BasicUtil.getString

Продолжайте переходить к SpringUtil.getRequest(), внешний интерфейс не обрабатывается, SQL-инъекция - настоящий молот

4. Подтверждение уязвимости

Когда проект запустится, создайте инструкцию sql http://localhost:8080/ms-mcms/mcms/search.do?categoryId=1%27)%20%20or+updatexml(1,concat(0x7e,(SELECT+%40 %40version ),0x7e),1)%23 Получите версию 5.7.27 mysql и убедитесь, что инъекция существует.

3. Резюме

Вышеизложенное является основным методом аудита sql-инъекций mybatis.Есть также проблемы с несколькими точками, которые мы не проанализировали.Новички могут попытаться проанализировать различные точки инъекции, чтобы попрактиковаться снова, и я считаю, что будет больше преимуществ. Когда мы снова столкнемся с подобными проблемами, мы можем рассмотреть:

1. Аудит SQL-инъекций в рамках Mybatis, уделяя особое внимание трем аспектам, таким как, в каком порядке и по порядку.

2. При написании sql в xml режиме можно сначала отфильтровать xml файл для поиска $, проанализировать по одному, особое внимание уделить порядку инжектом mybatis-generator

3. Аннотации Mybatis похожи при написании sql

4. Проверка параметров должна выполняться на уровне Java, предполагая, что пользовательский ввод является злонамеренным, чтобы предотвратить потенциальные атаки.

Обратите внимание на публичный аккаунт WeChat: Songhua сказал, становитесь более захватывающим!

Адрес блога:www.liangsonghua.com

Введение в общедоступную учетную запись: делитесь техническими знаниями о работе на JD.com, а также технологиями JAVA и лучшими отраслевыми практиками, большинство из которых являются прагматичными, понятными и воспроизводимыми.