Как хакеры могут обойти проверки безопасности JavaScript, используя его слабую типизацию.

Как вы, возможно, знаете, JavaScript — язык со слабой типизацией. Эти особенности языка могут использоваться хакерами для обхода некоторых проверок в приложении Node.js. Итак, что же подразумевается под слабым типом? Рассмотрим следующий пример:

var a =1;
var b ="1";
var c= a + b;
console.log(c==="11");  //return True

Итак, в приведенном выше примере, если целое число добавляется к строке, вместо того, чтобы выдавать ошибку, целое число будет преобразовано в строку и добавлено к ней. Таким образом, в JavaScript его тип данных может меняться во время вычислений. Вот почему мы назвали JavaScript слабо типизированным языком.

Но как хакеры могут использовать эти функции? Теперь давайте взглянем на приведенный ниже простой пример:

let username = "Peter";
if (username === "admin")
{
    console.log("access denied!");
}
else
{
     console.log("hello "+username);   //output: hello Peter
}

Итак, это приложение простое. Приложение проверяет, является ли пользователь администратором. Если да, выведите «отказано в доступе!». Если нет, напечатайте «hello {username}». Итак, есть ли способ обойти эту проверку и заставить приложение печатать «привет, админ»? Ответ - да!

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

"admin" === "admin" //return True
"admin" === ["admin"] //return False

В приведенной выше ситуации первая строка кода возвращает True, поскольку и тип, и содержимое идентичны. Вторая строка кода возвращает false, потому что она сравнивает строку со списком.

Легкий? Давай продолжим.

Теперь мы попробуем что-то вроде показанного ниже:

let greeting1 = "Hi "+"admin";
let greeting2 = "Hi "+["admin"];
greeting1===greeting2 //return True

Теперь, если мы добавим строку и список с одной и той же строкой и сравним их вывод. Вместо этого вы обнаружите, что он возвращает True. Это потому, что когда к списку добавляется строка, он также становится строкой. Итак, чтобы обойти это, это очень просто. Просто установите имя пользователя на [“admin”], как показано ниже:

let username = ["admin"];
if (username === "admin")
{
    console.log("access denied!");
}
else
{
     console.log("hello "+username);   //output: hello admin
}

Видеть? Можно просто так обойти.

Заключение

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

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.