За твърде много компании не е чак след е настъпило нарушение на сигурността че най-добрите практики за уеб сигурност стават приоритет. През годините си на работа като професионалист по ИТ сигурност, виждах от време на време колко неясен може да бъде светът на проблемите със сигурността на уеб разработката за толкова много от моите колеги програмисти .
Ефективният подход към заплахите за уеб сигурност по дефиниция трябва да бъде проактивен и защитен. За тази цел тази публикация има за цел да предизвика инерция на мисленето, надявайки се да инжектира читателя със здравословна доза параноя.
По-конкретно, това ръководство се фокусира върху 10 общи и важни подводни камъка, които трябва да знаете, включително препоръки за това как те могат да бъдат смекчени. Фокусът е върху Топ 10 уеб уязвимости идентифицирани от Проект за отворена защита на уеб приложения (OWASP) , международна организация с нестопанска цел, чиято цел е да подобри сигурността на софтуера по целия свят.
Когато разговарям с други програмисти и ИТ специалисти, често срещам объркване по отношение на разграничението между упълномощаване и удостоверяване. И разбира се, фактът съкращението авт често се използва и за двете помага за влошаване на това често срещано объркване. Това объркване е толкова често срещано, че може би този проблем трябва да бъде включен в тази публикация като „Обща нулева уязвимост на мрежата“.
Така че, преди да продължим, нека изясним разграничението между тези два термина:
Казано по друг начин, удостоверяване е да знаете кой е даден субект, докато упълномощаване е да знаем какво може даден обект. Имайки това предвид, нека да влезем в първите 10 проблема със сигурността в интернет.
Недостатъците на инжектирането са резултат от класически неуспех за филтриране на недоверен вход. Това може да се случи, когато предавате нефилтрирани данни на SQL сървъра (SQL инжекция), на браузъра (XSS - ще говорим за това по късно ), към LDAP сървъра (LDAP инжектиране) или някъде другаде. Проблемът тук е, че нападателят може да инжектира команди на тези обекти, което води до загуба на данни и отвличане на браузърите на клиентите.
Всичко, което вашето приложение получава от ненадеждни източници, трябва да бъде филтрирано, за предпочитане според бял списък. Почти никога не трябва да използвате черен списък, тъй като получаването на това право е много трудно и обикновено е лесно да се заобиколи. Антивирусните софтуерни продукти обикновено предоставят звездни примери за неуспешни черни списъци. Съвпадението на шаблона не работи.
Предотвратяване: Добрата новина е, че защитата срещу инжектиране е 'просто' въпрос на правилно филтриране на входа и мислене дали на даден вход може да се вярва. Но лошата новина е, че всичко входът трябва да бъде правилно филтриран, освен ако на него несъмнено може да се има доверие (но поговорката „никога не казвай никога“ тук идва на ум).
Например в система с 1000 входа успешното филтриране на 999 от тях не е достатъчно, тъй като това все още оставя едно поле, което може да служи като изцеление на Ахил, за да разруши вашата система. И може би си мислите, че поставянето на резултат от SQL заявка в друга заявка е добра идея, тъй като на базата данни се има доверие, но ако периметърът не е, входът идва индиректно от момчета с злоупотреба. Това се казва SQL инжекция от втори ред в случай, че се интересувате.
Тъй като филтрирането е доста трудно да се направи правилно (като крипто), това, което обикновено съветвам, е да разчитате на функциите за филтриране на вашата рамка: доказано е, че работят и са внимателно проучени. Ако не използвате рамки, наистина трябва да помислите добре дали не използването им наистина има смисъл в контекста на сигурността на вашия сървър. 99% от случаите не е така.
Това е колекция от множество проблеми, които могат да възникнат по време на нарушено удостоверяване, но не всички произтичат от една и съща основна причина.
Ако приемем, че някой все още иска да пусне собствения си код за удостоверяване през 2014 г. (какво мислите ??), съветвам го да не се използва. Изключително трудно е да се постигне право и има безброй възможни клопки, само да спомена няколко:
Предотвратяване: Най-ясният начин да се избегне тази уязвимост на уеб защитата е използването на рамка. Може да успеете да приложите това правилно, но първото е много по-лесно. В случай, че искате да пуснете свой собствен код, бъдете изключително параноични и се научете какви са клопките. Има доста.
Това е доста широко разпространен провал на хигиенизирането на входа (по същество специален случай на често срещана грешка # 1 ). Атакуващият дава JavaScript маркери на вашето приложение при въвеждане. Когато този вход се върне на потребителя несинизиран, браузърът на потребителя ще го изпълни. Това може да бъде толкова просто, колкото създаването на връзка и убеждаването на потребителя да щракне върху нея, или може да бъде нещо много по-зловещо. При зареждане на страницата скриптът се изпълнява и например може да се използва за публикуване на бисквитките ви към нападателя.
Предотвратяване: Има просто решение за уеб защита: не връщайте HTML маркери на клиента. Това има допълнителната полза от защитата срещу инжектиране на HTML, подобна атака, при която атакуващият инжектира обикновено HTML съдържание (като изображения или силни невидими флаш плейъри) - не с голямо въздействие, но със сигурност досадно („моля, спрете!“). Обикновено заобикалящото решение е просто преобразуване на всички HTML обекти , така че това се връща като . Другият често използван метод за саниране е използването на регулярни изрази за премахване на HTML тагове, използващи регулярни изрази на
<
и >
, но това е опасно, тъй като много браузъри ще интерпретират силно счупен HTML съвсем добре. По-добре да конвертирате всички символи в избягалите си колеги.
Това е класически случай на доверие на потребителския вход и плащане на цената в резултат на уязвимост на сигурността. Директната препратка към обект означава, че вътрешен обект като файл или ключ на базата данни е изложен на потребителя. Проблемът с това е, че нападателят може да предостави тази препратка и, ако упълномощаването или не е принудено (или е нарушено), нападателят може да осъществи достъп или да направи неща, от които трябва да бъде изключен.
Например кодът има download.php
модул, който чете и позволява на потребителя да изтегля файлове, използвайки параметър CGI, за да посочи името на файла (например download.php?file=something.txt
). Или по погрешка, или поради мързел, разработчикът е пропуснал упълномощаването от кода. Атакуващият вече може да използва това, за да изтегли всички системни файлове, до които потребителят, изпълняващ PHP, има достъп, като самия код на приложението или други данни, оставени да лежат на сървъра, като резервни копия. А-а.
какво е .cpp файл
Друг често срещан пример за уязвимост е функцията за нулиране на парола, която разчита на въвеждането от потребителя, за да определи чия парола нулираме. След като щракне върху валидния URL адрес, нападателят може просто да модифицира username
поле в URL адреса, за да се каже нещо като „администратор“.
Между другото, и двата примера са неща, които аз самият съм виждал да се появяват често „в дивата природа“.
Предотвратяване: Извършете упълномощаването на потребителя правилно и последователно и добавете избора в белия списък. По-често обаче, целият проблем може да бъде избегнат чрез вътрешно съхраняване на данни и без да се разчита на предаването им от клиента чрез параметрите на CGI. Променливите на сесията в повечето рамки са подходящи за тази цел.
Според моя опит уеб сървърите и приложенията, които са били неправилно конфигурирани, са много по-често срещани от тези, които са конфигурирани правилно. Може би това е така, защото не липсват начини да се объркате. Няколко примера:
Предотвратяване: Имате добър (за предпочитане автоматизиран) процес „изграждане и внедряване“, който може да изпълнява тестове при внедряване. Решението за неправилно конфигуриране на сигурността на бедния човек е куки след фиксиране, за да се предотврати излизането на кода с вградени пароли по подразбиране и / или разработчици.
Тази уязвимост на уеб защитата е свързана с крипто и защита на ресурсите. Чувствителните данни трябва да бъдат шифровани по всяко време, включително при транзит и в покой. Без изключения. Данните за кредитната карта и потребителските пароли трябва никога пътувайте или се съхранявайте нешифровани, а паролите винаги трябва да се хешират. Очевидно алгоритъмът за крипто / хеширане не трябва да е слаб - когато се съмнявате, препоръчват стандартите за уеб сигурност AES (256 бита и повече) и RSA (2048 бита и повече) .
И макар да се разбира, че идентификаторите на сесии и чувствителните данни не трябва да се движат в URL адресите, а чувствителните бисквитки трябва да имат защитен флаг, това е много важно и не може да бъде прекалено подчертано.
Предотвратяване:
Транзитно: Използвайте HTTPS с надлежно удостоверение и PFS (Perfect Forward Secrecy) . Не приемайте нищо по връзки, които не са HTTPS. Имайте защитеното знаме върху бисквитките.
На склад: Това е по-трудно. Първо и най-важно, трябва да намалите експозицията си. Ако не се нуждаете от чувствителни данни, настържете ги. Данните, които не разполагате, не могат да бъдат откраднат . Не съхранявайте информация за кредитна карта някога , тъй като вероятно не искате да се занимавате с това да бъдете PCI съвместим . Регистрирайте се с процесор за плащане като Ивица или Брейнтрий . Второ, ако имате поверителни данни, от които всъщност се нуждаете, съхранявайте ги криптирани и се уверете, че всички пароли са хеширани. За хеширане използвайте bcrypt се препоръчва. Ако не използвате bcrypt, обучете се осоляване и дъга маси .
И с риск да заявим очевидното, не съхранявайте ключовете за криптиране до защитените данни . Това е като да съхранявате велосипеда си с ключалка, в която има ключа. Защитете архивите си с криптиране и дръжте ключовете си много поверителни. И разбира се, не губете ключовете!
Това е просто неуспех при упълномощаване. Това означава, че когато на сървъра се извика функция, не е извършено правилно упълномощаване. Много пъти разработчиците разчитат на факта, че сървърната страна е генерирала потребителския интерфейс и смятат, че функционалността, която не се предоставя от сървъра, не може да бъде достъпна от клиента. Не е толкова просто, тъй като нападателят винаги може да подправя заявки към „скритата“ функционалност и няма да бъде възпрепятстван от факта, че потребителският интерфейс не прави тази функционалност лесно достъпна. Представете си, че има /admin
панел и бутонът присъства в потребителския интерфейс само ако потребителят всъщност е администратор. Нищо не пречи на нападателя да открие тази функционалност и да я използва неправилно, ако липсва разрешение.
Предотвратяване: От страна на сървъра, оторизацията трябва винаги да се направи. Да винаги. Никакви изключения или уязвимости няма да доведат до сериозни проблеми.
Това е хубав пример за объркан заместник атака, при която браузърът е заблуден от друга страна, за да злоупотреби с авторитета си. Сайт на трета страна, например, може да накара браузъра на потребителя да злоупотребява с това, че има право да направи нещо за нападателя.
В случай на CSRF, сайт на трета страна издава заявки към целевия сайт (например вашата банка), използвайки вашия браузър с вашите бисквитки / сесия. Ако например сте влезли в един раздел на началната страница на банката си и те са уязвими на тази атака, друг раздел може да накара браузъра ви да злоупотребява с идентификационните си данни от името на нападателя, което води до объркания проблем на заместника. Заместникът е браузърът, който злоупотребява с правомощията си (бисквитки на сесията), за да направи нещо, което нападателят го инструктира.
Помислете за този пример:
Атакуващият Алис иска да облекчи портфейла на Тод, като й прехвърли част от парите си. Банката на Тод е уязвима за CSRF. За да изпрати пари, Тод трябва да получи достъп до следния URL адрес:
за какво се използва езикът за програмиране cimg / back-end / 29/10-най-често срещаните-уеб-сигурност-уязвимости.jpg
След като този URL се отвори, на Тод се представя страница за успех и прехвърлянето е извършено. Алис също така знае, че Тод често посещава сайт под нейния контрол на blog.aliceisawesome.com, където тя поставя следния фрагмент:
Посещавайки уебсайта на Алис, браузърът на Тод смята, че Алис се свързва с изображение и автоматично издава HTTP GET заявка за извличане на снимката, но това всъщност дава указания на банката на Тод да преведе 1500 долара на Алис.
Между другото, в допълнение към демонстрирането на уязвимостта на CSRF, този пример също демонстрира промяна на състоянието на сървъра с идемпотентна HTTP GET заявка, която сама по себе си е сериозна уязвимост. HTTP GET заявки трябва да бъда идемпотентен (безопасно), което означава, че те не могат да променят ресурса, до който има достъп. Никога, никога, никога не използвайте идемпотентни методи за промяна на състоянието на сървъра.
Забавен факт: CSRF е и методът, който хората са използвали за пълнене на бисквитки в миналото, докато филиалите не са станали по-мъдри.
Предотвратяване: Съхранявайте таен маркер в поле за скрита форма, което е недостъпно от сайта на трета страна. Разбира се, винаги трябва да проверявате това скрито поле. Някои сайтове искат и вашата парола, когато променят чувствителни настройки (като имейл за напомняне на паролата ви например), въпреки че подозирам, че това е там, за да се предотврати злоупотребата с вашите изоставени сесии (например в интернет кафе).
Заглавието казва всичко. Отново бих класифицирал това като по-скоро проблем за поддръжка / внедряване. Преди да включите нов код, направете проучване, вероятно одит. Използване на код, който сте получили от случаен човек GitHub или някой форум може да е много удобен, но не е без риск от сериозна уязвимост в уеб сигурността.
Виждал съм много случаи, например, където са попаднали сайтове притежавани (т.е. там, където външен човек получава административен достъп до система), не защото програмистите са били глупави, а защото софтуерът на трета страна остава неизправен в продължение на години в производството. Това се случва през цялото време с плъгини WordPress например. Ако смятате, че няма да намерят скритите ви phpmyadmin
инсталация, позволете ми да ви запозная с dirbuster.
Урокът тук е, че разработването на софтуер не приключва, когато приложението бъде внедрено. Трябва да има документация, тестове и планове за това как да се поддържа и поддържа актуализирано, особено ако съдържа компоненти на трети страни или с отворен код.
Предотвратяване:
Бъдете внимателни. Освен очевидно повишено внимание при използване на такива компоненти, не бъдете и copy-paste кодер. Проверете внимателно парчето код, което възнамерявате да въведете във вашия софтуер, тъй като той може да бъде повреден без поправка (или в някои случаи умишлено злонамерено - атаките за уеб сигурност понякога са неволно поканени по този начин).
Бъдете в течение. Уверете се, че използвате най-новите версии на всичко, на което имате доверие, и имайте план да ги актуализирате редовно. Абонирайте се поне за бюлетин за нови уязвимости в сигурността по отношение на продукта.
Това отново е проблем с филтрирането на входа. Да предположим, че целевият сайт има redirect.php
модул, който приема URL като GET
параметър. Манипулирането на параметъра може да създаде URL на targetsite.com
който пренасочва браузъра към malwareinstall.com
. Когато потребителят види връзката, ще види targetsite.com/blahblahblah
който потребителят смята за доверен и безопасен за кликване. Те малко знаят, че това всъщност ще ги прехвърли на страницата за отпадане на злонамерен софтуер (или друга злонамерена). Алтернативно, нападателят може да пренасочи браузъра към targetsite.com/deleteprofile?confirm=1
.
Струва си да се спомене, че пълненето на дезинфекциран от потребителя вход в HTTP заглавка може да доведе до инжекция с хедър което е доста лошо.
Предотвратяване: Опциите включват:
Надявам се, че успях да погъделичкам малко мозъка ви с тази публикация и да въведа здравословна доза параноя и осъзнаване на уязвимостта на сигурността на уебсайта.
Основният извод тук е, че вековните софтуерни практики съществуват по някаква причина и това, което се е прилагало през деня за препълване на буфери, все още се прилага за мариновани низове в Python днес. Протоколите за сигурност ви помагат да пишете (още) правилни програми, към които трябва да се стремят всички програмисти.
Моля, използвайте това знание отговорно и не тествайте страници без разрешение!
За повече информация и повече специфични атаки от страна на сървъра , Погледни: https://www.owasp.org/index.php/Category:Attack .
Отзивите за тази публикация и нейните съвети за смекчаване са добре дошли и оценявани. Планират се бъдещи свързани постове, особено по въпроса разпределено отказване на услуга (DDoS) и уязвимости на ИТ сигурността в старата школа (не в мрежата). Ако имате конкретна заявка за какъв вид уеб защита да пишете, моля не се колебайте да се свържете с мен директно на [имейл защитен]
Ето сигурността на уебсайта! Наздраве.
Свързани:Заплахите за сигурността в интернет са методи за злоупотреба с уеб технологията в ущърб на уеб сайт, неговите потребители или дори интернет като цяло. Те възникват от уеб сайтове, които са неправилно конфигурирани, които са били неволно програмирани с уязвимости или които разчитат на компоненти, които самите са уязвими.
Топ 10 на заплахите за интернет защита са недостатъците на инжектиране и удостоверяване, XSS, несигурни преки препратки към обекти, неправилно конфигуриране на защитата, излагане на чувствителни данни, липса на упълномощаване на ниво функция, CSRF, несигурни компоненти и нефилтрирани пренасочвания.
Уверете се, че всяко пренасочване, което прави вашият сайт (чрез HTTP заглавки, мета тагове, JavaScript и т.н.), не разчита на въведеното от потребителя или ако го прави, че потребителското въвеждане е дезинфекцирано, например чрез бял списък.
CSRF токенът дава на сървъра да знае, че заявката е дошла от потребителя на собствения му сайт, а не от някой друг уеб сайт, който потребителят посещава. Това е така, защото се подава с всяка заявка чрез скрито поле на формуляра, предотвратявайки злонамерени сайтове да действат от името на своите зрители чрез CSRF атаки.
Известен също като „мръсен“ или „ненадежден“ вход, невалидиран вход е всеки вход, който се изпраща до вашия сървър. Всяко парче код, което използва такъв вход, без да го дезинфекцира първо, е уязвимост в сигурността, която може да бъде обърната срещу вас, вашите потребители и дори невинни наблюдатели.
SQL инжектирането е когато вашият код поставя невалидиран вход директно в SQL оператор, вместо да използва параметризирана заявка (т.е. такава със запазени места.) За щастие, SQL инжекционните атаки са едни от най-лесните за смекчаване, тъй като поддръжката на параметризирани заявки е вградена във всяка база данни достъп до библиотека.
XSS експлоатира погрешно внедряване на обща „функция“ на уеб приложение: за получаване на HTML от един потребител и представянето му на други потребители. Тъй като нефилтрираният HTML може да съдържа JavaScript, нападателят може след това да стартира код от името на други потребители, когато следващият път използват въпросното уеб приложение.
Неправилната конфигурация на защитата често включва използване на настройки по подразбиране, които трябва да бъдат променени: ключове и пароли, достъп до данни и услуги, който първоначално е либерален за удобство при настройка и тестване, и пренебрегване на текущите актуализации на защитата.
Това е, когато сървърът не е програмиран да проверява оторизацията за дадена функция. Често това идва от мисленето „сигурност чрез неизвестност“: Погрешно се предполага, че ако чувствителна функция не се показва на всички, потенциалните нападатели никога няма да разберат за нея.
Излагането на чувствителни данни е, когато приложение (или поради собствения си недостатък, или чрез злоупотреба с нападател на уязвимост) разкрива лични данни на потребителя (напр. Номера на кредитни карти) на неоторизирана трета страна: Други потребители, бизнес партньори, служители или публично.