Есть ли кусок кода JavaScript, который будет компилироваться во всех заглавных буквах? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть раздел веб-сайта, который читает входные данные и отображает их на сайте.Разница лишь в том, что текст конвертируется во все столицы.

Я хочу доказать, что инъекция JavaScript возможна.

Например, если я сохраню

 <script>alert('hello');</script>

, получитсязаписывается в HTML как

 <SCRIPT>ALERT('HELLO');</SCRIPT>

Поскольку ALERT не является ключевым словом javascript, ничего не запускается.

Можно ли создать что-то, что можно преобразовать во все заглавные буквы, которые javascript может скомпилировать, чтобы показать другим людям, что внедрение кода возможно?

Текст усекается до 60 символов.

Ответы [ 2 ]

4 голосов
/ 06 июня 2019

Гипотетически, если конвертер достаточно глуп, чтобы действовать только на буквы, вы можете преобразовать вредоносный код во что-то вроде JSFuck , для работы которого используются только следующие символы: ()+[]! ни один из которых не имеет заглавных букв альтернатива.

Идея состоит в том, чтобы просто найти нужные символы без их реального выражения. На самом деле в этом и заключается весь смысл этого конкретного эзотерического языка: сопоставление определенных символов и последующая оценка их.

Например: (![]+"")[1] означает "a"

  1. ![] означает false
  2. false+"" означает "false"
  3. ("false")[1] означает "a"

Оттуда вы можете создать любую функцию, какую захотите, не набирая ни одной строчной буквы. Сложная часть - заставить этот код выполняться в глобальном контексте длиной до 60 символов. Данная библиотека показывает, что вы можете добраться до Window с помощью []["filter"]["constructor"]("return this")(), но вам необходимо сначала отобразить эти строчные буквы в других символах.


Несмотря ни на что, гораздо лучше просто найти способ явно запретить выполнение контента, предоставленного пользователем, в глобальном контексте. Вы не обойдете вокруг куста, находя мягкие меры, чтобы он не работал. Что если в следующей версии JavaScript появится языковая функция, которая подрывает этот механизм предотвращения?

Если вы хотите испытать головную боль, подумайте о том, как найти способ избежать XSS-фильтрации: Шпаргалка XSS Filter Evasion . Вам также следует взглянуть на этот вопрос, он предлагает широкое обсуждение инъекции сценариев, созданных пользователем: Как предотвратить атаки инъекцией Javascript в пользовательский HTML .

0 голосов
/ 06 июня 2019

Если вы используете jQuery на своем веб-сайте, вы можете просто переназначить $, что приведет к уничтожению любого кода, который использует его напрямую:

//some normal code
$("div").css("color", "red"); //boom!
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<SCRIPT>$ = "I COME FROM EVIL INPUT"</SCRIPT>

<div>Some content</div>

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

//some normal code but this time protected
(function($) {
//        ^---<-- not using the global $ <-----
  $("div").css("color", "red");//             |
})(jQuery)//                                  |
// ^^^^^^-->---------------------->-----------^
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<SCRIPT>$ = "I COME FROM EVIL INPUT"</SCRIPT>

<div>Some content</div>

Однако в последнее время это немного утратило популярность - обычно просто jQuery использует $, поэтому вам не всегда нужно его защищать. Вы уверены, каждая строка, где у вас есть $, не является глобальной?

Если да, то вот следующая атака, такая же простая, как эта:

const someJSON = '{ "name" : "Fred", "age" : 42 }';

const obj = JSON.parse(someJSON); //boom!
console.log(obj.name);
<SCRIPT>JSON = "I COME FROM EVIL INPUT"</SCRIPT>

Используете ли вы AJAX для связи с сервером? Или попытаться получить вещи из localStorage? Ну, я очень сомневаюсь, что вы столь же защищены от JSON, как от $, и я сомневаюсь, что у вас есть собственные читатели JSON.

Я надеюсь, что вы можете видеть шаблон сейчас - все, что прикреплено к window и все заглавные буквы, могут быть нацелены и, таким образом, наносить вред приложению.

У меня мало сомнений в том, что все заглавные буквы JS можно манипулировать для получения строчных букв. Я не могу думать о том, как сейчас, но когда злоумышленник поймет это, вы можете ожидать еще более грубых, но эффективных вещей:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<SCRIPT>$("HTML")["html"]("I COME FROM EVIL INPUT")</SCRIPT>
<!--               ^^^^ this needs to be lowercased...and boom! -->
<body>
  <div>Some content</div>

  <div>Some more content</div>

  <div>Final content</div>
</body>
...