Drupal biztonság
  
Ki célpont?
  
”mi nem vagyunk célpontok”
 Az adatok értékesek 
(pl. tematizált email 
címlista az {user} 
táblából)
 A látogatók ér...
  
Ki célpont?
Mindenki
  
Biztonságról általában
 Csak biztonságos és nem 
biztonságos oldal van, nincs 
félig biztonságos
 Egy rossz sor kód i...
  
Hálózati biztonság
 Titkosított protokollok használata (FTP és HTTP 
(feltöltés) kerülendő)
 Wi­Fi esetén WPA titkosí...
  
Így hallgathatlak le téged
  
Bárki lehallgathat
 Nem csak a képzett ”crackerek”
sudo ifconfig wlan0 down
sudo iwconfig wlan0 mode monitor
sudo ifco...
  
Megoldások
 SSL­lel titkosított protokollok használata:
 FTPS
 SFTP
 HTTPS
 SSH
 VPN
  
Szerverbeállítások
 FastCGI (DDoS ellen jobb)
 PHP
 suhosin használata
 php.ini
 open_basedir
 disabled_functions...
  
Formok biztonsága
 a hidden (és bármilyen más) mezők tartalmai 
ugyanúgy módosíthatóak a felhasználók által! 
(meglepő...
  
Formok biztonsága
 Bizonyos érzékeny adatok (pl.: bankkártya szám) 
beviteli mezőjénél az autocomplete=”off” 
attribút...
  
HTTP kérések
 Írás soha ne legyen GET
 Létrehozás, szerkesztés az POST (form miatt), de a 
törlés is legyen az!
 Nem...
  
HTTP kérések
 Érzékeny adatot URL­ben soha
 http://example.com/register.php?
username=foo&password=bar&mail=foobar@ex...
  
JavaScript
 A JavaScript által végzett ellenőrzés csak kényelmi 
szolgáltatás, minden ellenőrzést el kell végezni a 
s...
  
JavaScript
 Valós életből vett ellenpélda:
     <script language="javascript">
<!­­//
/*This Script allows people to e...
  
File inclusion
 File­t SOHA nem include­olunk URL alapján
 Triviális példa:
http://example.com/index.php?p=../../../....
  
Drupal biztonság
  
Alapok
 Soha, de soha ne nyúljunk a core kódhoz!
  
Alapok
 Használjuk a Drupal függvényeit és API­jait
 Nálunk tapasztaltabb emberek írták
 Könnyű megtanulni őket
 Ho...
  
Alapok
 Minimális jogosultságok mindenkinek
 A következő jogosultságok megadásával odaadjuk 
a siteunkat:
 Administe...
  
Input formats
 Amit csak nagyon megbízható felhasználóknak 
engedünk:
 Full HTML
 PHP
  
Access control
 Használd:
 node_access
 user_access
 hook_menu
  
hook_menu()
 'access callback'
 ezzel a függvénnyel ellenőrzi a Drupal, hogy az adott 
felhasználó jogosult­e az olda...
  
hook_menu()
 Rossz példa:
function hook_menu() {
return array(
'foobar' => array(
'access callback' => TRUE,
),
);
}
  
hook_menu()
 Még egy rossz példa
function hook_menu() {
return array('foobar' => array(
'access callback' => user_acce...
  
hook_menu()
 Jó példa
function hook_perm() { return array('do sg with my module'); }
function hook_menu() {
return arr...
  
Valamit csinálni akarunk egy másik 
user nevében
 Rossz példa
global $user;
…
$user = user_load(1);
 Rossz példa
glob...
  
Valamit csinálni akarunk egy másik 
user nevében
 Jó példa
global $user;
…
session_save_session(FALSE);
$user = user_l...
  
SQL injection
 Nem megfelelően 
kezelt sztring 
beillesztése SQL 
lekérésbe
 Mindig kritikus hiba
  
SQL injection
 mysqli_query(”SELECT * FROM node WHERE 
nid = ” . $_GET['nid']);
 Ez ilyesztő
  
SQL injection
 mysqli_query(”SELECT * FROM node WHERE 
nid = ” . $_REQUEST['nid']);
 Ez még ilyesztőbb
  
SQL injection
 mysqli_query($_REQUEST['searchQuery']);
 Ez talán a legrémesebb.
 Van ilyen: Google ”inurl:SELECT inu...
  
SQL injection
 Nem SQL injection, de sok kezdő fejlesztő 
beleszalad
 SELECT * FROM ”user” WHERE ”name” LIKE 
'%$user...
  
Feltöltött fájlok
 Mindig ellenőrizni:
 méret
 kiterjesztés
 felbontás (képek esetén)
 file_check_location()
 Leh...
  
CSRF
<img src=”http://drupal.org/logout”/>
  
CSRF
 Cross­site request forgery
  
Megelőzés
 Ahol lehet, ott form api­t használni
 token használata
 hozzáadás:
$token = drupal_get_token('foo');
l($t...
  
XSS
 Cross site scripting
  
XSS példa
 Node címek listázása saját theme függvénnyel:
$output = '<li>' . $node­>title . '</li>';
return $output;
 ...
  
XSS
 Nem csak vicces dialógusok feldobálásra való
 Bármit megtehetünk, amit az adott bejelentkezett 
felhasználó megt...
  
Példa
$.get(Drupal.settings.basePath + 'user/1/edit',
function (data, status) {
if (status == 'success') {
var payload ...
  
Védekezés
 ”Csak” escape­elni kell
 htmlspecialchars($text, ENT_QUOTES, 'UTF­8');
 de nem szabad elfelejteni
 nem k...
  
Problémák
 A környezet más értelmet ad a jeleknek
I CAN HAZ <b>CHEEZBURGER</b> LULZ!
<b> is not deprecated
<span attri...
  
Megoldások
 check_plain()
 check_markup()
 check_url()
 filter_xss()
 t()
  
check_plain()
 plain text környezet:
<b> is not deprecated
 html környezet:
&lt;b&gt; is not deprecated
  
check_markup()
 Rich text környezet
[#8] foobar n baz
 HTML környezet
<p> <a href=”http://drupal.org/node/8”> node/8 ...
  
check_url()
 URL környezet
http://asdf.com/?foo=42&bar=baz
 HTML környezet
http://asdf.com/?foo=42&amp;bar=baz
  
filter_xss()
 Felhasználó által adott HTML
<p>foo</p><script>alert('bar');</script>
 Biztonságos HTML
<p>foo</p>alert...
  
filter_xss()
 Felhasználó által adott HTML
<img src=”abc.jpg” onmouseover=”...” />
 Biztonságos HTML
<img src=”abc.jp...
  
filter_xss()
 Felhasználó által adott HTML
<img src=”javascript:doSomethingBad()” />
 Biztonságos HTML
<img src=”doSo...
  
Mi mit vár
 HTML
 checkboxes #options
 radios #options
 l()
 drupal_set_title
 drupal_set_message
 watchdog
 Si...
  
Mi mit vár
 HTML
 site mission
 slogan
 footer
  
Mi mit vár
 Sima szöveg
 termek
 felhasználónevek
 tartalomtípusok
 node név
  
Mi mit vár
 Rich text
 comment body
 node body
  
t()
 Plain text   HTML→
 t('@var', array('@var' => $plain_text));
 @: plain text
 t('%var', array('%var' => $plain_...
  
.htaccess
 Nagyon fontos fájl!
 Ha nincs ott, akkor könnyen okozhat 
sebezhetőséget
 pl.: directory listing + backup...
  
Példák sebezhetőségekre
  Webshopnál az áru mennyisége nem ”1”, hanem 
”.1”
 Webshop: ár eltárolása hidden mezőben, á...
  
Példák sebezhetőségekre
 Sütiben felhasználónév vagy userid eltárolása
 Sok oldalnál nyitvahagyják a memcache portját...
  
További olvasnivaló
 http://acko.net/blog/safe­string­theory­for­the­web
 http://drupal.org/writing­secure­code
 htt...
Upcoming SlideShare
Loading in …5
×

Dcourse security 2010

865
-1

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
865
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Dcourse security 2010

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

    Clipping is a handy way to collect important slides you want to go back to later.

×