SlideShare a Scribd company logo
1 of 61
Download to read offline
Drupal biztonság




Tuesday, April 3, 12
Ki célpont?




Tuesday, April 3, 12
”mi nem vagyunk célpontok”
         n        Az adatok értékesek (pl.
                   tematizált email címlista
                   az {user} táblából)
         n        A látogatók értékesek
         n        Minden gép számít
                   (botnetek)
         n        Vandálkodni jó :)

Tuesday, April 3, 12
Ki célpont?


                       Mindenki

Tuesday, April 3, 12
Biztonságról általában
         n
                   Csak biztonságos és nem
                   biztonságos oldal van, nincs
                   félig biztonságos
         n
                   Egy rossz sor kód is elég
                   ahhoz, hogy bárki bármit
                   tehessen az oldalunkkal /
                   szerverünkkel
         n
                   A webfejlesztő is programozó,
                   ugyanúgy kell nekünk is
                   törődnünk a biztonsággal,
                   mint annak, aki az amerikai
                   védelmi hivatalnak fejleszt.
Tuesday, April 3, 12
Hálózati biztonság

         n        Titkosított protokollok használata (FTP és HTTP (feltöltés)
                   kerülendő)
         n        Wi-Fi esetén WPA titkosítás
         n        Total Commander nem jelszómegőrző



Tuesday, April 3, 12
Így hallgathatlak le téged




Tuesday, April 3, 12
Bárki lehallgathat

         n        Nem csak a képzett ”crackerek”
                       sudo ifconfig wlan0 down

                       sudo iwconfig wlan0 mode monitor

                       sudo ifconfig wlan0 up

                       sudo wireshark




Tuesday, April 3, 12
Megoldások
         n        SSL-lel titkosított protokollok használata:
                       n   FTPS
                       n   SFTP
                       n   HTTPS
                       n   SSH
         n        VPN

Tuesday, April 3, 12
Szerverbeállítások
         n
                   FastCGI (DDoS ellen jobb)
         n
                   PHP
                       n
                            suhosin használata
                       n
                            php.ini
                                n
                                      open_basedir
                                n
                                      disabled_functions
                                n
                                      disabled_classes
                                n
                                      safe_mode kikapcsolása (hamis biztonságérzet, gyakorlatban
                                      nem sokat véd)
Tuesday, April 3, 12
Formok biztonsága

         n        a hidden (és bármilyen más) mezők tartalmai ugyanúgy
                   módosíthatóak a felhasználók által! (meglepően sok oldal
                   törhető így)
         n        szerencsére ezt a form api kivédi



Tuesday, April 3, 12
Formok biztonsága


         n        Bizonyos érzékeny adatok (pl.: bankkártya szám) beviteli
                   mezőjénél az autocomplete=”off” attribútum használata




Tuesday, April 3, 12
HTTP kérések
         n        Írás soha ne legyen GET
         n        Létrehozás, szerkesztés az POST (form miatt), de a törlés is
                   legyen az!
         n        Nem árt, ha rákérdezünk a felhasználóra törlés előtt
                   (Drupalban: confirm_form() függvény)
         n        Ha bejut valamilyen bot, akkor a linkeken végigmegy →
                   ha ez egy admin felület, akkor törölheti az összes
                   tartalmat
Tuesday, April 3, 12
HTTP kérések


         n        Érzékeny adatot URL-ben soha
         n        http://example.com/register.php?
                   username=foo&password=bar&mail=foobar@example.com




Tuesday, April 3, 12
JavaScript


         n        A JavaScript által végzett ellenőrzés csak kényelmi
                   szolgáltatás, minden ellenőrzést el kell végezni a szerver
                   oldalon is!




Tuesday, April 3, 12
JavaScript
         n        Valós életből vett ellenpélda:
              <script language="javascript">
                  <!--//
                  /*This Script allows people to enter by using a form that asks for a
                  UserID and Password*/
                  function pasuser(form) {
                      if (form.id.value=="buyers") {
                           if (form.pass.value=="gov1996") {
                               location="http://officers.federalsuppliers.com/agents.html"
                           } else {
                               alert("Invalid Password")
                           }
                  } else {
                           alert("Invalid UserID")
                      }
                  }
                  //-->
                  </script>



Tuesday, April 3, 12
File inclusion

         n        File-t SOHA nem include-olunk URL alapján
         n        Triviális példa:
                       http://example.com/index.php?p=../../../../etc/
                           passwd
                       http://example.com/index.php?p=index.php


Tuesday, April 3, 12
Drupal biztonság




Tuesday, April 3, 12
Alapok


         n        Soha, de soha ne nyúljunk a core kódhoz!




Tuesday, April 3, 12
Alapok

         n        Használjuk a Drupal függvényeit és API-jait
                       n   Nálunk tapasztaltabb emberek írták
                       n   Könnyű megtanulni őket
                       n   Hosszú távon úgyis gyorsabban végezzük el a
                            feladatainkat


Tuesday, April 3, 12
Alapok
         n        Minimális jogosultságok mindenkinek
         n        A következő jogosultságok megadásával odaadjuk a
                   siteunkat:
                       n   Administer content types
                       n   Administer users
                       n   Administer permissions
                       n   Administer filters
                       n   Administer site configuration
Tuesday, April 3, 12
Input formats


         n        Amit csak nagyon megbízható felhasználóknak engedünk:
                       n   Full HTML
                       n   PHP



Tuesday, April 3, 12
Access control

         n        Használd:
                       n   node_access
                       n   user_access
                       n   hook_menu



Tuesday, April 3, 12
hook_menu()
         n        'access callback'
                       n   ezzel a függvénnyel ellenőrzi a Drupal, hogy az
                            adott felhasználó jogosult-e az oldal megnézésére
                       n   alapértelmezett érték: user_access
         n        'access arguments'
                       n   egy tömb, ami paraméterként adódik át
                       n   user_access esetén elég egy elem, a jogosultság
                            neve
Tuesday, April 3, 12
hook_menu()
         n
                   Rossz példa:
                       function hook_menu() {
                               return array(
                                      'foobar' => array(
                                               'access callback' => TRUE,
                                      ),
                               );
                       }
Tuesday, April 3, 12
hook_menu()
         n        Még egy rossz példa
                       function hook_menu() {
                               return array('foobar' => array(
                                      'access callback' => user_access('some
                                          permission'),
                               ));
                       }

Tuesday, April 3, 12
hook_menu()
         n
                   Jó példa

         function hook_perm() { return array('do sg with my module'); }

         function hook_menu() {

                       return array( 'foobar' => array(

                                'access arguments' => array('do sg with my module'),

                       ));

         }

Tuesday, April 3, 12
Valamit csinálni akarunk egy másik user
      nevében
         n
                   Rossz példa

                       global $user;

                       …

                       $user = user_load(1);
         n
                   Rossz példa

                       global $user;

                       ...

                       $user->uid = 1;

Tuesday, April 3, 12
Valamit csinálni akarunk egy másik user
      nevében
         n        Jó példa
                       global $user;
                       …
                       drupal_save_session(FALSE);
                       $user = user_load(1);
         n        Ha nem muszáj a jelenlegi userre hivatkozni, akkor ne
                   használjuk az user változót
Tuesday, April 3, 12
SQL injection

         n        Nem megfelelően kezelt
                   sztring beillesztése SQL
                   lekérésbe
         n        Mindig kritikus hiba



Tuesday, April 3, 12
SQL injection


         n        mysqli_query(”SELECT * FROM node WHERE nid =
                   ” . $_GET['nid']);

         n        Ez ilyesztő




Tuesday, April 3, 12
SQL injection


         n        mysqli_query(”SELECT * FROM node WHERE nid =
                   ” . $_REQUEST['nid']);

         n        Ez még ilyesztőbb




Tuesday, April 3, 12
SQL injection

         n        mysqli_query($_REQUEST['searchQuery']);

         n        Ez talán a legrémesebb.
         n        Van ilyen: Google ”inurl:SELECT inurl:FROM inurl:WHERE”




Tuesday, April 3, 12
SQL injection


         n        Nem SQL injection, de sok kezdő fejlesztő beleszalad
         n        SELECT * FROM ”user” WHERE ”name” LIKE '%
                   $username%'




Tuesday, April 3, 12
Feltöltött fájlok
         n        Mindig ellenőrizni:
                       n   méret
                       n   kiterjesztés
                       n   felbontás (képek esetén)
         n        file_check_location()
         n        Lehetőleg soha ne include-oljunk felhasználó által feltöltött
                   fájlt
Tuesday, April 3, 12
CSRF


         <img src=”http://drupal.org/logout”/>




Tuesday, April 3, 12
CSRF


         n        Cross-site request forgery




Tuesday, April 3, 12
Megelőzés
         n
                   Ahol lehet, ott form api-t használni
         n
                   token használata
                      n
                            hozzáadás:
                                $token = drupal_get_token('foo');
                                l($text, ”some/path/$token”);
                       n
                            ellenőrzés:
                                function my_page_callback($args, $token) {
                                          if(!drupal_valid_token($token, 'foo'))
                                                   drupal_access_denied();
                                          else {
                                                   ...
                                          }
                                }
Tuesday, April 3, 12
XSS


         n        Cross site scripting




Tuesday, April 3, 12
XSS példa

         n        Node címek listázása saját theme függvénnyel:
                       $output = '<li>' . $node->title . '</li>';

                       return $output;

         n        Mi van, ha a node címe a következő?
                       '<script>alert(”U R H4XXD LULZ”);
                          </script>'



Tuesday, April 3, 12
XSS


         n        Nem csak vicces dialógusok feldobálásra való
         n        Bármit megtehetünk, amit az adott bejelentkezett
                   felhasználó megtehet.




Tuesday, April 3, 12
Példa
      $.get(Drupal.settings.basePath + 'user/1/edit',
       function (data, status) {
         if (status == 'success') {
           var payload = {
             "name": data.match(/id="edit-name" size="[0-9]*" value="([a-z0-9]*)"/)[1],
             "mail":
               data.match(/id="edit-mail" size="[0-9]*" value="([a-z0-9]*@[a-z0-9]*.[a-z0-9]*)"/)[1],
             "form_id": 'user_profile_form',
             "form_token":
               data.match(/id="edit-user-profile-form-form-token" value="([a-z0-9]*)"/)[1],
             build_id:
            data.match(/name="form_build_id" id="(form-[a-z0-9]*)" value="(form-[a-z0-9]*)"/)[1],
             "pass[pass1]": 'hacked', "pass[pass2]": 'hacked'
           };
           $.post(Drupal.settings.basePath + 'user/1/edit', payload);
           }
         }
       );




Tuesday, April 3, 12
Védekezés
         n        ”Csak” escape-elni kell
                       n   htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
                       n   de nem szabad elfelejteni
                       n   nem kellene többször megcsinálni
                       n   abban a szövegben sem lesz markup, ahol kellene
                            lennie

Tuesday, April 3, 12
Problémák

         n        A környezet más értelmet ad a jeleknek
                       I CAN HAZ <b>CHEEZBURGER</b> LULZ!
                       <b> is not deprecated
                       <span attribute=”$foo”>$bar</span>



Tuesday, April 3, 12
Megoldások

         n        check_plain()
         n        check_markup()
         n        check_url()
         n        filter_xss()
         n        t()


Tuesday, April 3, 12
check_plain()

         n        plain text környezet:
                       <b> is not deprecated
         n        html környezet:
                       &lt;b&gt; is not deprecated



Tuesday, April 3, 12
check_markup()
         n        Rich text környezet
                       [#8] foobar n baz




         n        HTML környezet
                       <p> <a href=”http://drupal.org/node/8”> node/8
                          </a> foobar <br /> baz </p>
Tuesday, April 3, 12
check_url()

         n        URL környezet
                       http://asdf.com/?foo=42&bar=baz
         n        HTML környezet
                       http://asdf.com/?foo=42&amp;bar=baz



Tuesday, April 3, 12
filter_xss()

         n        Felhasználó által adott HTML
                       <p>foo</p><script>alert('bar');</script>
         n        Biztonságos HTML
                       <p>foo</p>alert('bar');



Tuesday, April 3, 12
filter_xss()

         n        Felhasználó által adott HTML
                       <img src=”abc.jpg” onmouseover=”...” />
         n        Biztonságos HTML
                       <img src=”abc.jpg” />



Tuesday, April 3, 12
filter_xss()

         n        Felhasználó által adott HTML
                       <img src=”javascript:doSomethingBad()” />
         n        Biztonságos HTML
                       <img src=”doSomethingBad()” />



Tuesday, April 3, 12
Mi mit vár
         n        HTML                           n
                                                       Sima szöveg
                       n   checkboxes #options         n
                                                             select #options
                       n   radios #options
                                                        n
                                                             l()
                       n   l()
                       n   drupal_set_title
                       n   drupal_set_message
                       n   watchdog

Tuesday, April 3, 12
Mi mit vár

         n        HTML
                       n   site mission
                       n   slogan
                       n   footer



Tuesday, April 3, 12
Mi mit vár

         n        Sima szöveg
                       n   termek
                       n   felhasználónevek
                       n   tartalomtípusok
                       n   node név


Tuesday, April 3, 12
Mi mit vár


         n        Rich text
                       n   comment body
                       n   node body



Tuesday, April 3, 12
t()
         n        Plain text → HTML
                       n   t('@var', array('@var' => $plain_text));
                               n   @: plain text
                       n   t('%var', array('%var' => $plain_text));
                               n   %: kiemelt szöveg
         n        HTML → HTML
                       n   t('!var', array('!var' => $html));
Tuesday, April 3, 12
.htaccess


         n        Nagyon fontos fájl!
         n        Ha nincs ott, akkor könnyen okozhat sebezhetőséget
         n        pl.: directory listing + backup a settings.php-ről



Tuesday, April 3, 12
Példák sebezhetőségekre


         n            Webshopnál az áru mennyisége nem ”1”, hanem ”.1”
         n        Webshop: ár eltárolása hidden mezőben, átírva 0-ra ingyen
                   lehet rendelni




Tuesday, April 3, 12
Példák sebezhetőségekre


         n        Sütiben felhasználónév vagy userid eltárolása
         n        Sok oldalnál nyitvahagyják a memcache portját (11211),
                   így a cache-elt adatok könnyedén manipulálhatók.




Tuesday, April 3, 12
További olvasnivaló
         n        http://acko.net/blog/safe-string-theory-for-the-web
         n        http://drupal.org/writing-secure-code
         n        http://drupal.org/security-team
         n        http://owasp.org
         n        http://crackingdrupal.com
         n        http://api.drupal.org

Tuesday, April 3, 12
recruitment@pronovix.com

                 Belga-magyar cég
                 Közép-Európa egyik legjobb csapata
                 <15 fő
                 Utazás, csoki, sör



Tuesday, April 3, 12

More Related Content

Featured

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 

Featured (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Drupal kurzus security (Drupal 7)

  • 3. ”mi nem vagyunk célpontok” n Az adatok értékesek (pl. tematizált email címlista az {user} táblából) n A látogatók értékesek n Minden gép számít (botnetek) n Vandálkodni jó :) Tuesday, April 3, 12
  • 4. Ki célpont? Mindenki Tuesday, April 3, 12
  • 5. Biztonságról általában n Csak biztonságos és nem biztonságos oldal van, nincs félig biztonságos n Egy rossz sor kód is elég ahhoz, hogy bárki bármit tehessen az oldalunkkal / szerverünkkel n A webfejlesztő is programozó, ugyanúgy kell nekünk is törődnünk a biztonsággal, mint annak, aki az amerikai védelmi hivatalnak fejleszt. Tuesday, April 3, 12
  • 6. Hálózati biztonság n Titkosított protokollok használata (FTP és HTTP (feltöltés) kerülendő) n Wi-Fi esetén WPA titkosítás n Total Commander nem jelszómegőrző Tuesday, April 3, 12
  • 7. Így hallgathatlak le téged Tuesday, April 3, 12
  • 8. Bárki lehallgathat n Nem csak a képzett ”crackerek” sudo ifconfig wlan0 down sudo iwconfig wlan0 mode monitor sudo ifconfig wlan0 up sudo wireshark Tuesday, April 3, 12
  • 9. Megoldások n SSL-lel titkosított protokollok használata: n FTPS n SFTP n HTTPS n SSH n VPN Tuesday, April 3, 12
  • 10. Szerverbeállítások n FastCGI (DDoS ellen jobb) n PHP n suhosin használata n php.ini n open_basedir n disabled_functions n disabled_classes n safe_mode kikapcsolása (hamis biztonságérzet, gyakorlatban nem sokat véd) Tuesday, April 3, 12
  • 11. Formok biztonsága n a hidden (és bármilyen más) mezők tartalmai ugyanúgy módosíthatóak a felhasználók által! (meglepően sok oldal törhető így) n szerencsére ezt a form api kivédi Tuesday, April 3, 12
  • 12. Formok biztonsága n Bizonyos érzékeny adatok (pl.: bankkártya szám) beviteli mezőjénél az autocomplete=”off” attribútum használata Tuesday, April 3, 12
  • 13. HTTP kérések n Írás soha ne legyen GET n Létrehozás, szerkesztés az POST (form miatt), de a törlés is legyen az! n Nem árt, ha rákérdezünk a felhasználóra törlés előtt (Drupalban: confirm_form() függvény) n Ha bejut valamilyen bot, akkor a linkeken végigmegy → ha ez egy admin felület, akkor törölheti az összes tartalmat Tuesday, April 3, 12
  • 14. HTTP kérések n Érzékeny adatot URL-ben soha n http://example.com/register.php? username=foo&password=bar&mail=foobar@example.com Tuesday, April 3, 12
  • 15. JavaScript n A JavaScript által végzett ellenőrzés csak kényelmi szolgáltatás, minden ellenőrzést el kell végezni a szerver oldalon is! Tuesday, April 3, 12
  • 16. JavaScript n Valós életből vett ellenpélda: <script language="javascript"> <!--// /*This Script allows people to enter by using a form that asks for a UserID and Password*/ function pasuser(form) { if (form.id.value=="buyers") { if (form.pass.value=="gov1996") { location="http://officers.federalsuppliers.com/agents.html" } else { alert("Invalid Password") } } else { alert("Invalid UserID") } } //--> </script> Tuesday, April 3, 12
  • 17. File inclusion n File-t SOHA nem include-olunk URL alapján n Triviális példa: http://example.com/index.php?p=../../../../etc/ passwd http://example.com/index.php?p=index.php Tuesday, April 3, 12
  • 19. Alapok n Soha, de soha ne nyúljunk a core kódhoz! Tuesday, April 3, 12
  • 20. Alapok n Használjuk a Drupal függvényeit és API-jait n Nálunk tapasztaltabb emberek írták n Könnyű megtanulni őket n Hosszú távon úgyis gyorsabban végezzük el a feladatainkat Tuesday, April 3, 12
  • 21. Alapok n Minimális jogosultságok mindenkinek n A következő jogosultságok megadásával odaadjuk a siteunkat: n Administer content types n Administer users n Administer permissions n Administer filters n Administer site configuration Tuesday, April 3, 12
  • 22. Input formats n Amit csak nagyon megbízható felhasználóknak engedünk: n Full HTML n PHP Tuesday, April 3, 12
  • 23. Access control n Használd: n node_access n user_access n hook_menu Tuesday, April 3, 12
  • 24. hook_menu() n 'access callback' n ezzel a függvénnyel ellenőrzi a Drupal, hogy az adott felhasználó jogosult-e az oldal megnézésére n alapértelmezett érték: user_access n 'access arguments' n egy tömb, ami paraméterként adódik át n user_access esetén elég egy elem, a jogosultság neve Tuesday, April 3, 12
  • 25. hook_menu() n Rossz példa: function hook_menu() { return array( 'foobar' => array( 'access callback' => TRUE, ), ); } Tuesday, April 3, 12
  • 26. hook_menu() n Még egy rossz példa function hook_menu() { return array('foobar' => array( 'access callback' => user_access('some permission'), )); } Tuesday, April 3, 12
  • 27. hook_menu() n Jó példa function hook_perm() { return array('do sg with my module'); } function hook_menu() { return array( 'foobar' => array( 'access arguments' => array('do sg with my module'), )); } Tuesday, April 3, 12
  • 28. Valamit csinálni akarunk egy másik user nevében n Rossz példa global $user; … $user = user_load(1); n Rossz példa global $user; ... $user->uid = 1; Tuesday, April 3, 12
  • 29. Valamit csinálni akarunk egy másik user nevében n Jó példa global $user; … drupal_save_session(FALSE); $user = user_load(1); n Ha nem muszáj a jelenlegi userre hivatkozni, akkor ne használjuk az user változót Tuesday, April 3, 12
  • 30. SQL injection n Nem megfelelően kezelt sztring beillesztése SQL lekérésbe n Mindig kritikus hiba Tuesday, April 3, 12
  • 31. SQL injection n mysqli_query(”SELECT * FROM node WHERE nid = ” . $_GET['nid']); n Ez ilyesztő Tuesday, April 3, 12
  • 32. SQL injection n mysqli_query(”SELECT * FROM node WHERE nid = ” . $_REQUEST['nid']); n Ez még ilyesztőbb Tuesday, April 3, 12
  • 33. SQL injection n mysqli_query($_REQUEST['searchQuery']); n Ez talán a legrémesebb. n Van ilyen: Google ”inurl:SELECT inurl:FROM inurl:WHERE” Tuesday, April 3, 12
  • 34. SQL injection n Nem SQL injection, de sok kezdő fejlesztő beleszalad n SELECT * FROM ”user” WHERE ”name” LIKE '% $username%' Tuesday, April 3, 12
  • 35. Feltöltött fájlok n Mindig ellenőrizni: n méret n kiterjesztés n felbontás (képek esetén) n file_check_location() n Lehetőleg soha ne include-oljunk felhasználó által feltöltött fájlt Tuesday, April 3, 12
  • 36. CSRF <img src=”http://drupal.org/logout”/> Tuesday, April 3, 12
  • 37. CSRF n Cross-site request forgery Tuesday, April 3, 12
  • 38. Megelőzés n Ahol lehet, ott form api-t használni n token használata n hozzáadás: $token = drupal_get_token('foo'); l($text, ”some/path/$token”); n ellenőrzés: function my_page_callback($args, $token) { if(!drupal_valid_token($token, 'foo')) drupal_access_denied(); else { ... } } Tuesday, April 3, 12
  • 39. XSS n Cross site scripting Tuesday, April 3, 12
  • 40. XSS példa n Node címek listázása saját theme függvénnyel: $output = '<li>' . $node->title . '</li>'; return $output; n Mi van, ha a node címe a következő? '<script>alert(”U R H4XXD LULZ”); </script>' Tuesday, April 3, 12
  • 41. XSS n Nem csak vicces dialógusok feldobálásra való n Bármit megtehetünk, amit az adott bejelentkezett felhasználó megtehet. Tuesday, April 3, 12
  • 42. Példa $.get(Drupal.settings.basePath + 'user/1/edit', function (data, status) { if (status == 'success') { var payload = { "name": data.match(/id="edit-name" size="[0-9]*" value="([a-z0-9]*)"/)[1], "mail": data.match(/id="edit-mail" size="[0-9]*" value="([a-z0-9]*@[a-z0-9]*.[a-z0-9]*)"/)[1], "form_id": 'user_profile_form', "form_token": data.match(/id="edit-user-profile-form-form-token" value="([a-z0-9]*)"/)[1], build_id: data.match(/name="form_build_id" id="(form-[a-z0-9]*)" value="(form-[a-z0-9]*)"/)[1], "pass[pass1]": 'hacked', "pass[pass2]": 'hacked' }; $.post(Drupal.settings.basePath + 'user/1/edit', payload); } } ); Tuesday, April 3, 12
  • 43. Védekezés n ”Csak” escape-elni kell n htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); n de nem szabad elfelejteni n nem kellene többször megcsinálni n abban a szövegben sem lesz markup, ahol kellene lennie Tuesday, April 3, 12
  • 44. Problémák n A környezet más értelmet ad a jeleknek I CAN HAZ <b>CHEEZBURGER</b> LULZ! <b> is not deprecated <span attribute=”$foo”>$bar</span> Tuesday, April 3, 12
  • 45. Megoldások n check_plain() n check_markup() n check_url() n filter_xss() n t() Tuesday, April 3, 12
  • 46. check_plain() n plain text környezet: <b> is not deprecated n html környezet: &lt;b&gt; is not deprecated Tuesday, April 3, 12
  • 47. check_markup() n Rich text környezet [#8] foobar n baz n HTML környezet <p> <a href=”http://drupal.org/node/8”> node/8 </a> foobar <br /> baz </p> Tuesday, April 3, 12
  • 48. check_url() n URL környezet http://asdf.com/?foo=42&bar=baz n HTML környezet http://asdf.com/?foo=42&amp;bar=baz Tuesday, April 3, 12
  • 49. filter_xss() n Felhasználó által adott HTML <p>foo</p><script>alert('bar');</script> n Biztonságos HTML <p>foo</p>alert('bar'); Tuesday, April 3, 12
  • 50. filter_xss() n Felhasználó által adott HTML <img src=”abc.jpg” onmouseover=”...” /> n Biztonságos HTML <img src=”abc.jpg” /> Tuesday, April 3, 12
  • 51. filter_xss() n Felhasználó által adott HTML <img src=”javascript:doSomethingBad()” /> n Biztonságos HTML <img src=”doSomethingBad()” /> Tuesday, April 3, 12
  • 52. Mi mit vár n HTML n Sima szöveg n checkboxes #options n select #options n radios #options n l() n l() n drupal_set_title n drupal_set_message n watchdog Tuesday, April 3, 12
  • 53. Mi mit vár n HTML n site mission n slogan n footer Tuesday, April 3, 12
  • 54. Mi mit vár n Sima szöveg n termek n felhasználónevek n tartalomtípusok n node név Tuesday, April 3, 12
  • 55. Mi mit vár n Rich text n comment body n node body Tuesday, April 3, 12
  • 56. t() n Plain text → HTML n t('@var', array('@var' => $plain_text)); n @: plain text n t('%var', array('%var' => $plain_text)); n %: kiemelt szöveg n HTML → HTML n t('!var', array('!var' => $html)); Tuesday, April 3, 12
  • 57. .htaccess n Nagyon fontos fájl! n Ha nincs ott, akkor könnyen okozhat sebezhetőséget n pl.: directory listing + backup a settings.php-ről Tuesday, April 3, 12
  • 58. Példák sebezhetőségekre n Webshopnál az áru mennyisége nem ”1”, hanem ”.1” n Webshop: ár eltárolása hidden mezőben, átírva 0-ra ingyen lehet rendelni Tuesday, April 3, 12
  • 59. Példák sebezhetőségekre n Sütiben felhasználónév vagy userid eltárolása n Sok oldalnál nyitvahagyják a memcache portját (11211), így a cache-elt adatok könnyedén manipulálhatók. Tuesday, April 3, 12
  • 60. További olvasnivaló n http://acko.net/blog/safe-string-theory-for-the-web n http://drupal.org/writing-secure-code n http://drupal.org/security-team n http://owasp.org n http://crackingdrupal.com n http://api.drupal.org Tuesday, April 3, 12
  • 61. recruitment@pronovix.com Belga-magyar cég Közép-Európa egyik legjobb csapata <15 fő Utazás, csoki, sör Tuesday, April 3, 12