Аудит кода Springboot — аудит Newbeemall
Аудит кода Springboot — аудит Newbeemall

Предисловие

ссылка @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 можно изменить.

Язык кода:javascript
копировать
server.port=8089
...
spring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_db?...

Путь к файлу конфигурации:/src/main/java/ltd/newbee/mall/config/NeeBeeMallWebMvcConfigurer.java,Путь к изображению настроен

Язык кода:javascript
копировать
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изабсолютныйпуть

Язык кода:javascript
копировать
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.

Язык кода:javascript
копировать
docker cp ./newbee_mall_schema.sql container_id:/root

(container_id — имя контейнера MySQL)

Войдите в контейнер MYSQL для создания базы данных.

Язык кода:javascript
копировать
root:/# mysql -u root -p
mysql> create database newbee_mall_db;
mysql> exit

Выполнить sql-файл

Язык кода:javascript
копировать
root:/# mysql -u root -p newbee_mall_db</root/newbee_mall_schema.sql

На этом этапе база данных успешно настроена.

Начать проект

После настройки, как указано выше, вы можете использовать IDEA Начать проект.

структура проекта Springboot

ссылка https://s31k31.github.io/2020/04/26/JavaSpringBootCodeAudit-2-SpringBoot/

SQL-инъекция

Первый выпуск на GitHub этого проекта посвящен SQL Внедрение уязвимостей https://github.com/newbee-ltd/newbee-mall/issues/1

В поле поиска проекта введите 1' Нашел ошибку

Вернитесь в IDEA, чтобы просмотреть сообщение об ошибке.

Язык кода:javascript
копировать
### 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

По сообщению об ошибке можно получить вот такую ​​полезную нагрузку

Язык кода:javascript
копировать
/search?keyword=1')) OR 1%23

Можно обнаружить, что все продукты повторяются

Его также можно легко обнаружить с помощью sqlmap.

Причины sql-инъекции

Найдено в конфигурации Mybatis NewBeeMallGoodsMapper.xml.

Здесь мы получаем ввод от пользователя keyword используется позже {keyword} для получения параметров от пользователей. и{} просто чистый string Замена, в динамике SQL 解析阶段将会进行переменная替换,Аналогично прямой замене строк,Приведёт к генерации SQL-инъекции.

MyBatisОфициальная документациясередина有如下叙述:

#{}Рассказывать MyBatis Создайте параметр подготовленного оператора (PreparedStatement) в JDBC , такой параметр находится в SQL будет обозначаться знаком "?" и передаваться в новый подготовленный оператор, например:

Язык кода:javascript
копировать
// Примерно 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 действительно нет. При этом проверка не обнаружила ни фильтрации, ни замены в других местах. Но здесь нет успеха 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 изпользователь下изодин

Другие пользователи также могут получить прямой доступ

CSRF и логические уязвимости

Автор воспроизвел,懒得写Понятно。Во всяком случае, я скопировал это из да и из

ссылка

https://s31k31.github.io/2020/05/05/JavaSpringBootCodeAudit-6-CSRF/

https://s31k31.github.io/2020/05/06/JavaSpringBootCodeAudit-7-Logical-Vulnerability/

boy illustration
Как использовать ArrayPool
boy illustration
Интегрируйте iText в Spring Boot для реализации замены контента на основе шаблонов PDF.
boy illustration
Redis реализует очередь задержки на основе zset
boy illustration
Получить текущий пакет jar. path_java получает файл jar.
boy illustration
Краткое обсуждение высокопроизводительного шлюза Apache ShenYu
boy illustration
Если вы этого не понимаете, то на собеседовании даже не осмелитесь сказать, что знакомы с Redis.
boy illustration
elasticsearch медленный запрос, устранение неполадок записи, запрос с подстановочными знаками
boy illustration
По какому стандарту взимается плата за обслуживание программного обеспечения?
boy illustration
IP-адрес Получить
boy illustration
【Java】Решено: org.springframework.web.HttpRequestMethodNotSupportedException
boy illustration
Native js отправляет запрос на публикацию_javascript отправляет запрос на публикацию
boy illustration
.net PDF в Word_pdf в Word
boy illustration
[Пул потоков] Как Springboot использует пул потоков
boy illustration
Подробное объяснение в одной статье: Как работают пулы потоков
boy illustration
Серия SpringCloud (6) | Поговорим о балансировке нагрузки
boy illustration
IDEA Maven может упаковать все импортное полностью красное решение — универсальное решение.
boy illustration
Последний выпуск 2023 года, самое полное руководство по обучению Spring Boot во всей сети (с интеллект-картой).
boy illustration
[Решено — Практическая работа] SaTokenException: запрос не может быть получен в контексте, отличном от Интернета. Решение проблем — Практическая работа.
boy illustration
HikariPool-1 - Connection is not available, request timed out after 30000ms
boy illustration
Power Query: автоматическое суммирование ежемесячных данных с обновлением одним щелчком мыши.
boy illustration
установка Ubuntu в среде npm
boy illustration
3 Бесплатные системы управления складом (WMS) .NET с открытым исходным кодом
boy illustration
Глубокое погружение в библиотеку Python Lassie: мощный инструмент для автоматизации извлечения метаданных
boy illustration
Объяснение прослушивателя серии Activiti7 последней версии 2023 года
boy illustration
API-интерфейс Jitu Express для электронных счетов-Express Bird [просто для понимания]
boy illustration
Каковы архитектуры микросервисов Java. Серверная часть плавающей области обслуживания
boy illustration
Описание трех режимов жизненного цикла службы внедрения зависимостей Asp.net Core.
boy illustration
Java реализует пользовательские аннотации для доступа к интерфейсу без проверки токена.
boy illustration
Серверная часть Unity добавляет поддержку .net 8. Я еще думал об этом два дня назад, и это сбылось.
boy illustration
Проект с открытым исходным кодом | Самый элегантный метод подписки на публичные аккаунты WeChat на данный момент