5494 n nikolov_zashtita

10
ИКОНОМИЧЕСКИ УНИВЕРСИТЕТ – ВАРНА ЦЕНТЪР ЗА МАГИСТЪРСКО ОБУЧЕНИЕ КАТЕДРА “ИНФОРМАТИКА” по БЕЗОПАСНОСТ И ЗАЩИТА НА Мicrosoft МРЕЖИ И ПРИЛОЖЕНИЯ на тема “Защита на Web приложения Cross Site Scripting, SQL Injection” Изготвил: Проверил: Николай Николов доц. д-р Стефан Дражев специалност: Приложна информатика – ДОВО VII курс, I гр., Ф № 5494 Варна 2013

Upload: nikolai-nikolov

Post on 20-Jun-2015

282 views

Category:

Documents


3 download

TRANSCRIPT

ИКОНОМИЧЕСКИ УНИВЕРСИТЕТ – ВАРНА

ЦЕНТЪР ЗА МАГИСТЪРСКО ОБУЧЕНИЕ

КАТЕДРА “ИНФОРМАТИКА”

по

БЕЗОПАСНОСТ И ЗАЩИТА НА Мicrosoft МРЕЖИ И

ПРИЛОЖЕНИЯ

на тема “Защита на Web приложения – Cross Site Scripting, SQL Injection”

Изготвил: Проверил:

Николай Николов доц. д-р Стефан Дражев

специалност:

Приложна информатика – ДОВО

VII курс, I гр., Ф № 5494

Варна 2013

Web приложения

Традиционните приложения се инсталират или се стартират от диск или

друга медиа. Те разчитат на дадена среда, която в общия случай се осигурява от

операционната система.

При уеб приложенията, за да стартирате приложение използвате браузър.

В общия случай приложението се отваря след написване на неговия уеб адрес в

браузъра.

Днес уеб технологиите позволяват да се създават не само интерактивни и

функционални сайтове, но и напълно функционални уеб приложения, с

интерфейс, функционалност и бързодействие. Термина уеб приложение може да

се дефинира по следния начин: Софтуер, който работи в браузъра.

Web-базираните приложения са тясно свързани с Интернет. При тях

целият процес на въвеждане, обработване и запазване на информацията се

извършва в Глобалната мрежа. Основно предимство на този тип приложения е

лесният достъп до тях от която и да е точка на света. Информацията, която се

въвежда и променя, обикновено се запазва на отдалечен компютър-сървър, до

който трябва да имаме достъп всеки път, когато е необходимо да я

актуализираме. Самите уеб сайтове могат до известна степен да се смятат за

Web-базирани приложения особено когато става въпрос за динамични сайтове

със сложна структура и разширена функционалност. Постоянната активност на

такъв тип приложения е друго основно предимство, тъй като услугите, които се

предлагат, ще бъдат достъпни 24 часа в денонощието, 7 дни в седмицата (това е

идеалният случай). Високото ниво на сигурност на сървърите, разнообразието

от модули за управление на данните, както и достъпните цени правят Web-

базираните приложения желано средство за работа както за малкия и среден

бизнес, така и за големите корпорации.

Основен недостатък на този тип приложения е пряката зависимост на

системата за управление от редица фактори. Такива са например Интернет-

връзката, натоварването на сървъра, където се намира приложението или където

се записва информацията, възможността за поява на непозволени действия от

страна на някои потребители спрямо системата. Разбира се всички тези

потенциални проблеми са разрешими по един или друг начин, но е факт, че те

биха могли да доведат до нарушаване безпроблемната работа на Web-

приложението и евентуално до загуба на информация.

Зaщитaтa нa eднo yeб пpилoжeниe e eдин oт нaй-вaжнитe eтaпи, зaeднo c

пpoeктиpaнeтo и oптимизaциятa мy. Aтaкитe дaлeч нe ce cвeждaт caмo дo

MySQL Injection и XSS. Имa и oщe мнoгo дpyги, кaтo фaлшиви HTTP зaявки,

brute-force aтaки, пyбличнo излaгaнe нa кoд, oткpaдвaнe (фикcиpaнe) нa cecия и

дpyги.

MySQL Injection и XSS, oбaчe, ca нaй-чecтo cpeщaнитe aтaки, пopaди

мнoгoтo caйтoвe yязвими към тяx. Toвa ca aтaки, кoитo ce ocнoвaвaт нa

yязвимocти пpи изпpaщaнeтo и пoлyчaвaнeтo нa инфopмaция мeждy

пoтpeбитeля и cъpвъpa. Пpaвилoтo, кoeтo тpябвa дa ce cпaзвa, e чe вcичкo, кoeтo

влизa и излизa oт бaзaтa дaнни, тpябвa дa ce филтpиpa! He тpябвa дa ce имa

дoвepиe и нa никакви дaнни, пpeдcтaвeни oт пoтpeбитeля!

Cross Site Script (XSS) атаки

Cross Site Scripting (XSS) е атака, която използва уязвимост на

приложението и ”вмъква” нежелан код, който се изпълнява в браузъра на

крайния потребител. Най-общо казано атаката цели да намери място в

програмата, в което се отпечатва стойността на дадена променлива и не се

проверява коректно нейното съдържание. Обикновено в съдържанието на

променливата се записва HTML, XHTML, JavaScript, ActiveX, VBScript, Flash, и

др видове изпълним код. Възможностите за цел на атаката може да са много –

придобиване на достъп до защитена зона на сайта (чрез постигане на session

hijacking), подвеждане на потребителя да въведе информация към трети

източник (physhing), инсталиране на нежелани програми на компютъра на

потребителя (virus, worm, trojan, …), и др.

Видове XSS атаки:

1. Директни: Атакуващият предоставя връзка или друг вид “маскиран” код

към клиента. Когато клиента последва такава връзка той попада на

оригиналният уебсайт на дадената услуга, но вече с модифициран код. Тези

атаки са възможни най-вече чрез изпратени писма по e-mail.

2. Статични: Нежелания код се вмъква в базата данни след което се

изчавка уязвимата страница да бъде отворена. Това са най-честите атаки при

т.нар. социални мрежи – форуми, блогове, дискусионни групи, и т.н.

3. DOM: Това са XSS атаки от т.нар. локално ниво. Обикновено се

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

предизвика директна XSS атака към жертвата.

Как да бъде избегнат XSS.

Трябва да бъдат спазвани някой правила за да се постигне по-добра

защита от XSS атаки.

Никога не трябва да се вярваме на потребителите на даден сайт.

Всички входящи данни трябва да бъдат валидирани, нормализирани и

филтрирани.

Задължително трябва да бъдат прехвърлени определени знаци, в

съответните им HTML entry и да бъдат изпращани към браузъра само в този

вид. Задължително трябва да се конвертират:

& -> &

< -> &lt;

> -> &gt;

” -> &quot;

‘ -> &#x27;

/ -> &#x2F;

Когато към браузъра бъде изпратен &lt; ще го визуализира като < тоест

<script ще бъде изпратено като &lt;script , и бразузъра няма да го изпълни като

javascript.

Не слагайте лични данни и “коментари” на една страница

XSS не е само за крадене на сесия, XSS може да вземе цялата HTML

страница, или част от нея, и да я изпрати на някой сървър. Тоест ако на

страницата за “профил” на потребителя имате някакво поле, чийто данни идват

от външни потребители, то ако мине XSS атака, този код, ще може да вземе

цялата страница с всички данни на потребителя.

HTTPOnly флаг на бисквитките

Всеки език позволява този флаг да бъде вдигнат, и повечето браузъри го

спазват. Това което прави е, че не позволява на JS да чете тези бисквитки. Тоест

ако мине XSS, то кода не може да види бисквитките с този флаг, тоест няма

кражба на сесия.

На IP не може да се разчита

Голяма част от хората са с динамични IP адреси, други минават

(доброволно или не) през прокси сървъри, и е възможно 2 заявки от един и

същи потребител, да дойдат от 2 различни адреса, дори и заявките да са в

рамките на секунда. Някой доставчици правят нещата още по-зле, като AOL ,

понеже при тях всяка заявка е с различно IP, и на всичко отгоре е и от различен

град.

Примерна XSS атака към форма, която не е защитена по никакъв начин.

Формата е примерна и представлява част от „форма за регистрация“.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Контактна форма</title>

</head>

<body>

<form action="contact_insert12.php" method="post" name="forma12">

<table width=400 border=1>

<tr>

<td align="left">

<p>Име:<br/>

<input type="text" size="20" name="fname" /></p>

<p>Фамилия:<br/>

<input type="text" size="20" name="lname"/></p>

<p>Населено място:<br/>

<input type="text" size="20" name="place1"/></p>

<input type="submit" name="submit" value="Изпрати"/>

</td>

</tr>

</table>

</form>

</body>

</html>

Скрипт към формата, който ще извежда въведените данни

<?php

if(isset ($_POST['submit'])) {

$fname = $_POST['fname'];

$lname = $_POST['lname'];

$place1 = $_POST['place1'];

print 'Име: ' . $fname . '<br /> Фамилия: ' . $lname . '<br /> Град: ' . $place1;

}

?>

Кодът на нашата атака, който може да се постави в което и да е от

текстовите полета:

<div style="text-align: center;"><p style="font-family: Verdana; font-style:

normal; font-variant: normal; font-weight: bold; font-size: 36px; line-height:

normal; font-size-adjust: none; font-stretch: normal; color: rgb(255, 0,

0);">This

page has been Hacked!</p><img

src="http://ha.ckers.org/images/stallowned.jpg"

border="0"><p style="font-family: Arial; font-style: italic; font-variant:

normal;

font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust:

none;

font-stretch: normal; color: rgb(221, 221, 221);">XSS Defacement</p></div>

Резултатът, който ще получим е следния:

Ако направим една функция с име security, която ще има два параметъра.

Първият ще бъде стринга с данните, който искаме да проверим, а вторият няма

да е задължителен и ще бъде за максимална стойност на параметъра.

<?php

function security($data, $max = null)

{

if(is_numeric($data)) {

if($max == null) {

return (int)$data;

} else {

if($data <= $max) {

return (int)$data;

} else {

return "Въведената стойност е прекалено голяма!";

}

}

} else {

if($max == null) {

$data = htmlspecialchars(addslashes($data));

return $data;

} else {

if(strlen($data) <= $max) {

$data = htmlspecialchars(addslashes($data));

return $data;

} else {

return "Това поле не може да съдържа повече от $max символа";

}

}

}

}

if(isset ($_POST['submit'])) {

$fname = security ($_POST['fname'], 10);

$lname = security ($_POST['lname'], 15);

$place1 = security ($_POST['place1'], 15);

print 'Име: ' . $fname . '<br /> Фамилия: ' . $lname . '<br /> Град: ' . $place1;

}

?>

Резултатът, който ще получим е следния

Защита от SQL Injection

SQLi се използва за злонамерено изпълнение на SQL заявка към базата

данни.

Чрез тази техника може да бъдат експлоатирани уязвими кодове.

SQL инжeктиpaнeтo e нaй-чecтo cpeщaнaтa yязвимocт в PHP

пpилoжeниятa. To ce ocнoвaвa нa гpeшкa нa PHP пpoгpaмиcтa, пpи кoятo нe ce

филтpиpa инфopмaциятa, пoдaдeнa към бaзaтa дaнни. Чecтo нe ce филтpиpa и

въpнaтия peзyлтaт, пpи кoeтo ce paзкpивaт цeнни дaнни и пътищa.

Пример за oпacнocт oт MySQL Injection.

Aкo cкpипт зa вxoд в cиcтeмaтa имa cинтaкcиc oт poдa:

$sql = "SELECT * FROM users WHERE username = '$user' AND password =

'$pass'". Aкo към тaзи зaявкa, нapyшитeлят пoдaдe eдиничнa кавичка зa

пoтpeбитeлcкo имe и пpoизвoлнa пapoлa, зaявкaтa щe въpнe cлeднaтa гpeшкa:

You have an error in your SQL syntax; check the manual that corresponds to

your MySQL server version for the right syntax to use near 'WHERE username = ' ' '

AND password = 'sometext

C мнoгo мaлкo paбoтa (пoдaвaнe нa кaвичкa), нapyшитeлят вeчe знae

имeнaтa нa двe кoлoни oт тaблицaтa и тoвa, чe дaннитe и в двeтe пocoки нe ca

филтpиpaни пpaвилнo. Hapyшитeлят знae и cинтaкcиca нa клayзaтa WHERE, oт

къдeтo мoжe дa cи cглoби зaявки зa вcичкo, кoeтo мy тpябвa, например:

myuser ' or 'foo' = 'foo' --

Aкo тoвa ce въвeдe кaтo пoтpeбитeлcкo имe, нapyшитeлят щe влeзe

ycпeшнo в cиcтeмaтa, бeз дa имa нитo пoтpeбитeлcкo имe, нитo пapoлa. A aкo

нapyшитeлят знae пoтpeбитeлcкo имe c нyжнитe мy пpaвa, тoй мoжe дa влeзe и c

нeгo, бeз дa мy ce нaлaгa дa знae пapoлaтa, пpocтo въвeждa зa пoтpeбитeл:

cloxy' --

SQL инжeктиpaнeтo може да бъде избегнато. Вcички пpoмeнливи, кoитo

ce вкapвaт в eднa MySQL зaявкa, тpябвa дa бъдaт филтpиpaни c фyнкциятa

mysql_real_escape_string(). B гopния пpимep, тoвa ca пpoмeнливитe $user и

$pass. Cинтaкcиcът e както cлeдвa: $user = mysql_real_escape_string($user) и тaкa

зa $pass.

Най-лесния начин да се предпазите от SQL инжекции е да филтрирате

всички входящи данни. Например , чрез функциите:

htmlspecialchars(); addslashes(); и trim();

Функции

htmlspecialchars() - преобразува специални знаци в html единици

addslashes() - екранира специалните знаци на даден стринг

trim() - премахва знаци в началото и края на даден стринг

htmlentities() - преобразува всички подходящи знаци в HTML единици и е

.. сходна с htmlspecialchars();

Допълнителна защита може да бъде написването на скрипт, който

проверява за грешни пароли - при 3 грешни опита за вход с грешна парола в

базата данни, акаунта се заключва за 15 минути.

Причини за уязвимости към SQLi в системата могат да възникнат в тези

случай:

- Без филтриране на входящите данни

- Уязвимост в сървъра на базата данни

Методи за защита от SQL инжекция:

- Филтриране на данните

- Изключване на докладите за грешки.

- Създаване на потребител, с по-малко привилегии.

- Максимална стойност

Използвана литература

C. Snider, T. Mayer, M. Southwell, “Pro PHP Security” - Second edition

J. Grossman, R. Hansen, P. Petkov, A. Rager, “XSS Attacks”

R. Alvarez, D. Hartley, J. Hamler, H. Meer, “SQL Injection”

http://web-tourist.net

https://www.owasp.org

http://gatakka.eu

http://www.cphpvb.net