52 thoughts on “Какво са XSS, LFI, RFI

  1. venksta

    Редакция:
    Задаването на въпроси не се прави в коментарите
    Провери си мейла с който си публикувал този коментар

  2. qwerty_104

    Мерси Ванка.. Тъкмо като пуснеш формата мислех да те питам точно за XSS, но някой ме е изпреварил. Мерси за видеото 🙂

  3. не бях аз

    Направо – без бисквитки, без джава, без флаш и готово… Бях чел, че има ли джава и флаш на един сайт, няма как да се защитим. Беше го писал един параноик, чак мен зарази.

  4. kg

    Не разбрах как става номера с JavaScript в URL, може ли пример?
    Мога да забраня разлините символи с PHP, но с JavaScript може да се изведе URL, а с PHP да се изведе съдържанието на PHP, видимо само за браузъра.

  5. nvchbg

    @не бях аз

    да си паранойк не е толкова лошо
    най-малкото че ще се узорят да да те избабанят

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

    URL адпеса е над 128 символа
    режеш и оставяш само домейна

    ако URL-то има решеш и оставяш само домейна

  6. echeveria

    „Направо – без бисквитки, без джава, без флаш и готово… Бях чел, че има ли джава и флаш на един сайт, няма как да се защитим. Беше го писал един параноик, чак мен зарази.“
    java != javascript са различни езици бе, кви са тия коментари!

  7. echeveria

    Awaken ами доста са различни да ти кажа и като заразимост също, ся като използваемост и масовост js води по точки ама иначе…

  8. Николай

    Добре, но ако се обнови браузъра, или пък си смени операционната система, или просто се опита да влезе през друг компютър (или смартфон), това с фингърпринтс ще се прецака ли?

  9. thedem

    Хубаво клипче, помогна ми за затапване на 2 дупки по сайта :). И все пак ако трябва всичко да е сигурно SSL му е майката 🙂 или OpenSSl за без пари 🙂

  10. gatakka Автор

    SSL решава проблема с „човека по средата“, което не е малко, донякъде ограничава XSS, но не решава прблема напълно, понеже JS може да взима съдържание (HTML) и да го пуска навън.

    @Николай ще се смени „отпечатъка“, но колко често хора си сменят браузър или OS? Доста по-рядко, отколкото им изтича живота на сесията.

  11. kg

    „JS може да взима съдържание (HTML) и да го пуска навън“, PHP също го може, ама не разбрах как да добавя JS към URL? Ще ми трябва цялото съдържание на PHP

  12. gatakka Автор

    Копирайте този демо код и го сложете вместо URL и скролнете най-отгоре на страницата

    javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.getElementsByTagName(„img“); DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position=’absolute’; DIS.left=(Math.sin(R*x1+i*x2+x3)*x4+x5)+“px“; DIS.top=(Math.cos(R*y1+i*y2+y3)*y4+y5)+“px“}R++}setInterval(‘A()’,5); void(0);

  13. kg

    Може, ама ще ти го пратя на пощата 😉
    В примерът ти не пише как да разбера кода на PHP, че да му ползвам променливите.

  14. deiman

    Благодаря, много интересно 🙂 . Преди време когато се занимавах със cms- и като джумла, без да знам за какво иде реч разбрах че изпълняването на какъвто и да е код си е опасно, и забраних include на php + това във комент формата също да не се поставя код. Дотук добре, но това за javascrip-та на заден план не го знаех, доста е гадно и подмолно 🙂 , дори не подозирах че има такъв риск. Но все пак без да знам изобщо бъкел програмиране забраних изпълнението на код тогава, поне на 1 точка съм се защитил 🙂

  15. TheBroCode

    Един доста краен вариант за защита от XSS атаки е валидацията, например, ако имаме форма за коментари и очакваме потребителят да напише мнение на нещо, тогава нека не му разрешаваме да пише нищо, което е различно е А-Я, A-Z, 0-9. В този пример няма начин да мине никаква атака :))

  16. gatakka Автор

    Валидацията не е краен вариант а задължителен вариант за всичко 🙂

  17. gatakka Автор

    Ок включвам го в списъка, или ще е видео или статия с конкретни примери за защита срещу XSS

  18. Мартин

    За защита от xss е достатъчна функцията strip_tags. Кукито може да не бъде откраднато чрез js като се зададе на setcookie http_only или там каквото беше. Вижте в php.net за повече информация. Ако се знае какво точно очаквате, а не просто текст ( примерно потребителско име, имейл) може да валидирате с регулярни изрази. Вършат добра работа 🙂

  19. dersa

    Добре казваш, че би трябвало да неможе да се извършват тези атаки, но за съжеление има кодери, които пишат толкова грешен код (уязвим), че няма и на къде, а по-трагичното е, че взимат и пари за това…

  20. toshkabg

    Здравей,

    Аз мислиох по обяснението ти за XSS атаките, та исках да попитам едно въпросче.

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

    Мерси.

  21. gatakka Автор

    google ползват подобен модел, но имай предвид, че има много хора, които са с динамични IP-та, или проксита, което значи, че може без тяхно знание да им се смени IP-то.
    IP-то не е нещо на което може да разчиташ. Но IP локацията е сравнително точна.

  22. dns

    „google ползват подобен модел, но имай предвид, че има много хора, които са с динамични IP-та, или проксита, което значи, че може без тяхно знание да им се смени IP-то.
    IP-то не е нещо на което може да разчиташ. Но IP локацията е сравнително точна.“

    Ами ако се комбинира проверка на локацията + проверка на мак адреса и името на компютъра ще се получава ли по добра защита или не от xss атака?

  23. gatakka Автор

    Няма как да вземеш MAC адреса. Не се предава през HTTP протокола.

  24. dns

    Ще направиш ли още по темата за сигурността.
    Айде че ще си правя колекция на двд с твой технически видеа 🙂 (тамън да напълня двд-то)

  25. Pingback: Правила за защита от XSS атаки | Личен блог на Иван Ванков

  26. svetljjjo

    динамичните IP адреси не се сменят по време на браузването става след рестарт на компа . Така че можеш да разчиташ на IP заедно със сесията единствения проблем е че може да не сработи ако сайта ти предлага опция „запомни ме“ .
    Аз използвам следната функция през която прекарвам всички ПОСТ и ГЕТ заявки може и на вас да ви бъде полезна:

    function clean($str)
    {
    if (is_numeric($str)) $str=floor($str);
    $cleaned=strip_tags($str);
    $cleaned=htmlspecialchars($cleaned);
    $cleaned=mysql_real_escape_string($cleaned);
    $to_clean=array(„%20“, „\““, „‘“, ‘\\’, „=“, ‘;’, ‘:’,’http_’, ‘_server’, ‘delete%20’, ‘delete ‘, ‘delete-‘, ‘delete(‘, ‘(delete’, ‘drop%20’, ‘drop ‘, ‘create%20’, ‘update-‘, ‘update(‘, ‘(update’, ‘insert-‘, ‘insert(‘, ‘(insert’, ‘create ‘, ‘create(‘, ‘create-‘, ‘(create’, ‘update%20’, ‘update ‘, ‘insert%20’, ‘insert ‘, ‘select%20’, ‘select ‘, ‘bulk%20’, ‘bulk ‘, ‘union%20’, ‘union ‘, ‘select-‘, ‘select(‘, ‘(select’, ‘union-‘, ‘(union’, ‘union(‘, ‘or%20’, ‘or ‘, ‘and%20’, ‘and ‘, ‘exec’, ‘@@’, ‘%22’, ‘“‘, ‘openquery’, ‘openrowset’, ‘msdasql’, ‘sqloledb’, ‘sysobjects’, ‘syscolums’, ‘syslogins’, ‘sysxlogins’, ‘char%20’, ‘char ‘, ‘into%20’, ‘into ‘, ‘load%20’, ‘load ‘, ‘msys’, ‘alert%20’, ‘alert ‘, ‘eval%20’, ‘eval ‘, ‘onkeyup’, ‘x5cx’, ‘fromcharcode’, ‘javascript:’, ‘javascript.’, ‘vbscript:’, ‘vbscript.’, ‘http-equiv’, ‘->’, ‘expression%20’, ‘expression ‘, ‘url%20’, ‘url ‘, ‘innerhtml’, ‘document.’, ‘dynsrc’, ‘jsessionid’, ‘style%20’, ‘style ‘, ‘phpsessid’, ‘<applet', '<div', '<emded', '<iframe', '<img', '<meta', '<object', '<script', '<textarea', 'onabort', 'onblur', 'onchange', 'onclick', 'ondblclick', 'ondragdrop', 'onerror', 'onfocus', 'onkeydown', 'onkeypress', 'onload', 'onmouse', 'onmove', 'onreset', 'onresize', 'onselect', 'onsubmit', 'onunload', 'onreadystatechange', 'xmlhttp', 'uname%20', 'uname ', '%2C', 'union+', 'select+', 'delete+', 'create+', 'bulk+', 'or+', 'and+', 'into+', 'kill+', '+echr', '+chr', 'cmd+', '+1', 'user_password', 'id%20', 'id ', 'ls%20', 'ls ', 'cat%20', 'cat ', 'rm%20', 'rm ', 'kill%20', 'kill ', 'mail%20', 'mail ', 'wget%20', 'wget ', 'wget(', 'pwd%20', 'pwd ', 'objectclass', 'objectcategory', '<!-%20', '<!- ', 'total%20', 'total ', 'http%20request', 'http request', 'phpb8b4f2a0', 'phpinfo', 'php:', 'globals', '%2527', "%27", '\'', 'chr(', 'chr=', 'chr%20', 'chr ', '%20chr', ' chr', 'cmd=', 'cmd%20', 'cmd', '%20cmd', ' cmd', 'rush=', '%20rush', ' rush', 'rush%20', 'rush ', 'union%20', 'union ', '%20union', ' union', 'union(', 'union=', '%20echr', ' echr', 'esystem', 'cp%20', 'cp ', 'cp(', '%20cp', ' cp', 'mdir%20', 'mdir ', '%20mdir', ' mdir', 'mdir(', 'mcd%20', 'mcd ', 'mrd%20', 'mrd ', 'rm%20', 'rm ', '%20mcd', ' mcd', '%20mrd', ' mrd', '%20rm', ' rm', 'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'mv ', 'rmdir%20', 'rmdir ', 'mv(', 'rmdir(', 'chmod(', 'chmod%20', 'chmod ', 'cc%20', 'cc ', '%20chmod', ' chmod', 'chmod(', 'chmod=', 'chown%20', 'chown ', 'chgrp%20', 'chgrp ', 'chown(', 'chgrp(', 'locate%20', 'locate ', 'grep%20', 'grep ', 'locate(', 'grep(', 'diff%20', 'diff ', 'kill%20', 'kill ', 'kill(', 'killall', 'passwd%20', 'passwd ', '%20passwd', ' passwd', 'passwd(', 'telnet%20', 'telnet ', 'vi(', 'vi%20', 'vi ', 'nigga(', '%20nigga', ' nigga', 'nigga%20', 'nigga ', 'fopen', 'fwrite', '%20like', ' like', 'like%20', 'like ', '$_', '$get', '.system', 'http_php', '%20getenv', ' getenv', 'getenv%20', 'getenv ', 'new_password', '/password', 'etc/', '/groups', '/gshadow', 'http_user_agent', 'http_host', 'bin/', 'wget%20', 'wget ', 'uname%5c', 'uname', 'usr', '/chgrp', '=chown', 'usr/bin', 'g%5c', 'g\\', 'bin/python', 'bin/tclsh', 'bin/nasm', 'perl%20', 'perl ', '.pl', 'traceroute%20', 'traceroute ', 'tracert%20', 'tracert ', 'ping%20', 'ping ', '/usr/x11r6/bin/xterm', 'lsof%20', 'lsof ', '/mail', '.conf', 'motd%20', 'motd ', 'http/1.', '.inc.php', 'config.php', 'cgi-', '.eml', 'file%5c://', 'file\:', 'file://', 'window.open', 'img src', 'img%20src', 'img src', '.jsp', 'ftp.', 'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'nc.exe', '.htpasswd', 'servlet', '/etc/passwd', '/etc/shadow', 'wwwacl', '~root', '~ftp', '.js', '.jsp', '.history', 'bash_history', '~nobody', 'server-info', 'server-status', '%20reboot', ' reboot', '%20halt', ' halt', '%20powerdown', ' powerdown', '/home/ftp', '=reboot', 'www/', 'init%20', 'init ','=halt', '=powerdown', 'ereg(', 'secure_site', 'chunked', 'org.apache', '/servlet/con', '/robot', 'mod_gzip_status', '.inc', '.system', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '’, ‘sql=’, ‘_global’, ‘global_’, ‘global[‘, ‘_server’, ‘server_’, ‘server[‘, ‘/modules’, ‘modules/’, ‘phpadmin’, ‘root_path’, ‘_globals’, ‘globals_’, ‘globals[‘, ‘iso-8859-1’, ‘?hl=’, ‘%3fhl=’, ‘.exe’, ‘.sh’, ‘%00’, rawurldecode(‘%00’), ‘_env’, ‘/*’, ‘\\*’);
    $cleaned=str_replace($to_clean, „“, $cleaned);
    return $cleaned;
    }

  27. thedem

    Това не е ли достатъчно ? 🙂

    $name = $_POST[„name“];
    $mail = $_POST[„mail“];
    $comment = $_POST[„comment“];
    $name = strip_tags($name);
    $mail = strip_tags($mail);
    $comment = strip_tags($comment);
    $name = addslashes($name);
    $mail = addslashes($mail);
    $comment = addslashes($comment);

  28. gatakka Автор

    @svetljjjo не мога да кажа, че този метод е много ефективен по отношение на скорост или качество.

  29. svetljjjo

    Ами не знам за бързина аз работя на домашен сървър на една доста слаба машина за съвременните стандарти и то под Windos XP и съм си правил експерименти не се усеща никаква разлика поне на око не се вижда не съм правил тестове с програма за да кажа точно колко е забавянето.
    А за качеството ми се струва че е почти на 99% непробиваемо без да съм кракер разбира се .Ако някой може да добави нещо или да допълни ще се радвам . Тази функция е от опенсорс проект и ще е полезно да обогатим проекта по принцип.

  30. gatakka Автор

    @svetljjjo ако забавяне на един код може да се осети с една заявка на една машина, значи има проблем 🙂
    При по-високо натоварване, тогава си личи. Извинявай, аз съм малко изкривен на тема скорост 🙂 и пестене на ресурси 🙂
    Реално каквото прави този код е на едно място да чисти за XSS, инжекции, обикаляне на директории, изпълнение на шел команди….
    но кода нарушава едно много важно правило „Не модифицирай входящи данни, по необратим начин“:

    Ако човека иска да използва думата javascript в свой коментар, тя ще бъде премахната.

  31. Християн

    Просто ако иска да използва думата javascript, за защита можеш просто да поставиш разстояние между java и script. Няма да бие на око, но в същото време не може да се изпълни javascript.

  32. svetljjjo

    Е разбрах защо не се разбираме вие говорите за форуми и СМС системи или за места където се оставят мнения и коментари а пък аз се занимавам с онлайн игри. В моя случай javascript няма защо да се употребява и за това са я изчистили .

    А това за „Не модифицирай входящи данни, по необратим начин“ не го разбирам съвсем ?!?
    Ами какво да ги правя тея данни като са потенциално опасни ?!?
    Аз доколкото те разбрах нали сам каза с големия сатър е мисля че тая функция си е направо брадва за атаките.

  33. gatakka Автор

    Аз лично правя така, че ако усетя нещо нередно, въобще не изпълнявам кода, тоест казвам на човека „грешка бате“, това е голямата секира 🙂
    А не да покажа модифицираната му информация.
    Разбира се, това не е правило, а нещо което аз правя 🙂

  34. svetljjjo

    @xxTTcc не съм кракер но мисля че си пропуснал и още едно от вградените в РНР „mysql_real_escape_string“
    Щото коментарите се записват в БД

    А доколкото съм запознат всички вградени в РНР функций за защита не могат да спрат и половината от атаките.

    А това nl2br едва ли е защита то заменя края на реда с HTML “

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *