ссылка @s31k3 Магистр java Аудит кода платформы SpringBoot , эта статья воспроизводит только этот учебник Магистр, используемый для изучения аудита кода Springboot, обратите внимание, пожалуйста, обратитесь к исходному тексту. на @s31k3
Проверенный проект находится на github. 9.5k запустить проект с открытым исходным кодом Newbee-молл. Поскольку в последней версии проекта исправлено множество уязвимостей, в данной статье используется Oct 17, 2019 версия, адрес проекта https://github.com/newbee-ltd/newbee-mall/tree/36807c87d13ee9ca08aff75197063b8836d8711d。
Используйте IntelliJ IDEA, чтобы открыть папку проекта. После настройки SDK IDEA откроет его как проект maven и автоматически загрузит пакеты зависимостей.
SpringПуть к файлу свойств:/src/main/resources/application.properties
,Порт и адрес базы данных MySQL можно изменить.
server.port=8089
...
spring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_db?...
Путь к файлу конфигурации:/src/main/java/ltd/newbee/mall/config/NeeBeeMallWebMvcConfigurer.java
,Путь к изображению настроен
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/upload/**").addResourceLocations("file:" + Constants.FILE_UPLOAD_DIC);
registry.addResourceHandler("/goods-img/**").addResourceLocations("file:" + Constants.FILE_UPLOAD_DIC);
}
На данный момент данных испытаний нет.,нужно/src/main/resources/upload.zip
в сжатой упаковкеиз Разархивируйте данные тестового продукта,Поместите его в любую директорию. Это для целей обучения и тестирования.,Вы можете напрямую распаковать существование по текущему пути.,В официальной системе существование должно храниться в непроектном пути.
существоватьдокументsrc/main/java/ltd/newbee/mall/common/Constants.java
середина,переменнаяFILE_UPLOAD_DIC
для当前上传图片путь,изменить этодля Мы распаковываемupload.zip
изабсолютныйпуть
public class Constants {
//Загрузить файл с префиксом URL-адреса по умолчанию, изменить его в соответствии с настройками развертывания
public final static String FILE_UPLOAD_DIC = "/some_path/src/main/resources/upload/";
//public final static String FILE_UPLOAD_DIC = "D:\\upload\\";//Загрузить файл с префиксом URL-адреса по умолчанию, изменить его в соответствии с настройками развертывания
}
/src/main/resources
В каталоге есть файлы базы данных newbee_mall_schema.sql
. Используйте этот файл для создания базы данных.
База данных автора была удалена напрямую с помощью Docker.
docker cp ./newbee_mall_schema.sql container_id:/root
(container_id — имя контейнера MySQL)
Войдите в контейнер MYSQL для создания базы данных.
root:/# mysql -u root -p
mysql> create database newbee_mall_db;
mysql> exit
Выполнить sql-файл
root:/# mysql -u root -p newbee_mall_db</root/newbee_mall_schema.sql
На этом этапе база данных успешно настроена.
После настройки, как указано выше, вы можете использовать IDEA Начать проект.
ссылка https://s31k31.github.io/2020/04/26/JavaSpringBootCodeAudit-2-SpringBoot/
Первый выпуск на GitHub этого проекта посвящен SQL Внедрение уязвимостей https://github.com/newbee-ltd/newbee-mall/issues/1
В поле поиска проекта введите 1'
Нашел ошибку
Вернитесь в IDEA, чтобы просмотреть сообщение об ошибке.
### The error may involve ltd.newbee.mall.dao.NewBeeMallGoodsMapper.findNewBeeMallGoodsListBySearch-Inline
### The error occurred while setting parameters
### SQL: select goods_id, goods_name, goods_intro,goods_category_id, goods_cover_img, goods_carousel, original_price, selling_price, stock_num, tag, goods_sell_status, create_user, create_time, update_user, update_time from tb_newbee_mall_goods_info WHERE (goods_name like CONCAT('%','1'','%') or goods_intro like CONCAT('%','1'','%')) limit ?,?
### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1'','%'))
limit 0,10' at line 8
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1'','%'))
limit 0,10' at line 8] with root cause
java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1'','%'))
limit 0,10' at line 8
По сообщению об ошибке можно получить вот такую полезную нагрузку
/search?keyword=1')) OR 1%23
Можно обнаружить, что все продукты повторяются
Его также можно легко обнаружить с помощью sqlmap.
Причины sql-инъекции
Найдено в конфигурации Mybatis NewBeeMallGoodsMapper.xml.
Здесь мы получаем ввод от пользователя keyword используется позже {keyword} для получения параметров от пользователей. и{} просто чистый string Замена, в динамике SQL 解析阶段将会进行переменная替换,Аналогично прямой замене строк,Приведёт к генерации SQL-инъекции.
MyBatisОфициальная документациясередина有如下叙述:
#{}
Рассказывать MyBatis Создайте параметр подготовленного оператора (PreparedStatement) в JDBC , такой параметр находится в SQL будет обозначаться знаком "?" и передаваться в новый подготовленный оператор, например:
// Примерно JDBC код, а не MyBatis Код...
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);
в то же времяОфициальная документацияЭто верно ${}
Дайте предупреждение:
намекать Принимать вводимые пользователем данные таким образом и использовать их в качестве параметров оператора небезопасно и может привести к потенциальным ошибкам. SQL Инъекционная атака. Поэтому либо не разрешайте пользователям вводить эти поля, либо уходите и проверяйте эти параметры самостоятельно.
Подробнее о Mybatis изsqlинъекцияссылка https://s31k31.github.io/2020/05/01/JavaSpringBootCodeAudit-3-SQL-Injection/#SQL%E6%B3%A8%E5%85%A5%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1
Сначала тест черного ящика
В поле поиска нет XSS, перейдите к исходному коду, чтобы увидеть
Видно, что серверная часть не выполняет никакой обработки входящего ключевого слова. Но XSS действительно нет. При этом проверка не обнаружила ни фильтрации, ни замены в других местах. Но здесь нет успеха XSS, потому что проект использует шаблон тимелеафа для рендеринга, и этот шаблон имеет собственную функцию экранирования символов.
Здесь используется отображение строки поиска th:text
Выходные данные представляют собой экранированную строку.
Хотите получить строку без выхода из шаблона th:utext
Для этого выполните поиск по всему миру.
Нашёл эти два места
первое местосуществовать detail.html середина. Это демонстрация представления продукта.
Это можно изменить только через раздел «Введение в продукт» панели администратора.
Захват пакетов и изменение тегов
Презентация продукта на стойке регистрации успешно вызвала XSS.
существовать newbee_mall_goods_edit.html Также есть место в thymeleaf из th:utext
из тега, здесь можно редактировать описание продукта
Это место такое же, как указано выше,Введение в продукт Duda Эта часть из XSS (все требуют действий администратора),Не вредно)
Продолжите проверку черного ящика, попробуйте изменить адрес доставки в личном заказе и отправьте заказ.
Текущая страница не имеет никакого эффекта. Чтобы узнать это, перейдите в панель администратора и на страницу управления заказами.
Файлы cookie администратора можно получить. Вред больше.
В частности, взглянув на исходный код, вы обнаружите, что эта часть адреса доставки отображается «да», и вы можете получить копию данных json.,Затем интерфейс записывает данные на html-страницу браузера.,Вызывает хсс. Серверная часть не выполнила проверку законности информации об адресе доставки, введенной пользователем.
В этом проекте есть и другие базовые XSS, поэтому я не буду перечислять их по отдельности.
В проекте используется перехватчик (перехватчик) осуществляет контроль доступа на основе URL-пути. специфическийссылка https://s31k31.github.io/2020/05/04/JavaSpringBootCodeAudit-5-IDOR/ Автор видит лишь повторное появление этого мастера.
Рабочий процесс SpringMVCиз
Во-первых, давайте посмотрим, как с этим справится перехватчик.
InterceptorКонфигурациясуществовать/src/main/java/ltd/newbee/mall/config/NeeBeeMallWebMvcConfigurer.java
середина,Для URL-пути установлены различные перехватчики.
addPathPatterns
表示其серединаизпуть会经过设置из Перехватчик,excludePathPatterns
тогда перехватчик。其середина两个星**
означает соответствие любому символу,Если есть*
则表示匹配один个путь
Springсередина Перехватчикизраспространятьда Зависит отDispatcherServlet
来распространятьиз,То естьдав соответствии сServletPath
来распространятьпуть,иgetRequestURI
не имеющий отношения,То естьда Независимо от того, как вы его используете../
来做путь穿越,Наконец получитьизвозвращатьсядаServletPath。Если использовать что-то вроде%00
空字符进行截断путь,сделаюDispatcherServlet
无法将请求распространять到正确изController,что делает запрос недействительным.
Поэтому при последующей оценке запроса по маршруту следует использовать да. getServletPath()
Чтобы получить окончательное реальное распределение к месту маршрутизации из path
getRequestURI()
Только да получил запрос от URI
И этот администратор проекта из решения Interception да обрабатывается следующим образом:
использовал getRequestURI()
Чтобы получить URL-адрес, чтобы определить, заканчивается ли URL-адрес на /admin
начало, если /admin
Проверьте в начале сессии, в противном случае проверка не требуется.
Вот ультралегальная лазейка, ссылка https://joychou.org/web/security-of-getRequestURI.html
Можно использовать //admin
или /index/..;/admin
Непосредственно ультра-право стать администратором для.
ps: новая версия испрингиtomcat была изменена. /
;
Эта уязвимость, такая как особый символ правил сопоставления, может быть недоступна в новой версии.
Просто отладьте и посмотрите, что происходит.
Вы можете увидеть доступ к прошлому, чтобы получить из URI да //admin
, недостаточно /admin
Начальное состояние, возврат напрямую true Понятно。упомянутый вышеspringв соответствии сServletPath
来распространятьпуть,tomcat анализ серверов ServletPath
будет прав время от времени /
;
Подождите, пока будут обработаны специальные символы.
Как и выше //admin
После его обработкиServletPath
для /admin
,Тогда найди его напрямую /admin
из маршрутизируется, а перехватчик тоже дает из время true ,В результате получается ультра-право. На самом деле эта ультра-право уязвимость связана с неправильным использованием разработчиком функции из.,Вызывает плохой анализ сервера,Что создает проблемы.
Код аудита, существование изменить информацию о пользователе здесь
ltd/newbee/mall/controller/mall/PersonalController.java:114
Проверьте это updateUserInfo()
реализация,
ltd/newbee/mall/service/impl/NewBeeMallUserServiceImpl.java:72
Я обнаружил, что поиск пользователей по базе данных здесь не используется. session , а да передается напрямую как из userId для параметра для поиска и изменения данных, так что вот существующий уровень уязвимости ультра-право, измененный userId Вы можете изменять информацию других пользователей.
целевые пользователи userId для 11
Модифицируем через другого пользователя userIdдля 11из Информация о пользователе
Вы можете видеть, что модификация прошла успешно. userId для11изпользовательизинформация。
В другом месте существуют проверки этой части заказа.
ltd/newbee/mall/controller/mall/OrderController.java:36
Давайте следить здесь getOrderDetailByOrderNo()
реализация
ltd/newbee/mall/service/impl/NewBeeMallOrderServiceImpl.java:252
Здесь вы можете найти используемый запрос к базе данных Номер заказа Не да получено через сеанс из Номер заказ, пока пользователь с изда проходит в из orderNo。
этот пользователь userId для11 изпользователь下изодин
Другие пользователи также могут получить прямой доступ
Автор воспроизвел,懒得写Понятно。Во всяком случае, я скопировал это из да и из
ссылка
https://s31k31.github.io/2020/05/05/JavaSpringBootCodeAudit-6-CSRF/
https://s31k31.github.io/2020/05/06/JavaSpringBootCodeAudit-7-Logical-Vulnerability/