предисловие
Уязвимость 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, предполагая, что пользовательский ввод является злонамеренным, чтобы предотвратить потенциальные атаки.