drupal kurzus security (drupal 7)

61
Drupal biztonság Tuesday, April 3, 12

Upload: tamas-demeter-haludka

Post on 22-Apr-2015

1.676 views

Category:

Documents


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Drupal kurzus security (Drupal 7)

Drupal biztonság

Tuesday, April 3, 12

Page 2: Drupal kurzus security (Drupal 7)

Ki célpont?

Tuesday, April 3, 12

Page 3: Drupal kurzus security (Drupal 7)

”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ékesekn Minden gép számít

(botnetek)n Vandálkodni jó :)

Tuesday, April 3, 12

Page 4: Drupal kurzus security (Drupal 7)

Ki célpont?

Mindenki

Tuesday, April 3, 12

Page 5: Drupal kurzus security (Drupal 7)

Biztonságról általábann 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

Page 6: Drupal kurzus security (Drupal 7)

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ásn Total Commander nem jelszómegőrző

Tuesday, April 3, 12

Page 7: Drupal kurzus security (Drupal 7)

Így hallgathatlak le téged

Tuesday, April 3, 12

Page 8: Drupal kurzus security (Drupal 7)

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

Page 9: Drupal kurzus security (Drupal 7)

Megoldások

n SSL-lel titkosított protokollok használata:n FTPSn SFTPn HTTPSn SSH

n VPN

Tuesday, April 3, 12

Page 10: Drupal kurzus security (Drupal 7)

Szerverbeállításokn 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

Page 11: Drupal kurzus security (Drupal 7)

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

Page 12: Drupal kurzus security (Drupal 7)

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

Page 13: Drupal kurzus security (Drupal 7)

HTTP kérésekn Írás soha ne legyen GETn 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

Page 14: Drupal kurzus security (Drupal 7)

HTTP kérések

n Érzékeny adatot URL-ben sohan http://example.com/register.php?

username=foo&password=bar&[email protected]

Tuesday, April 3, 12

Page 15: Drupal kurzus security (Drupal 7)

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

Page 16: Drupal kurzus security (Drupal 7)

JavaScriptn Valós életből vett ellenpélda: <script language="javascript">

<!--///*This Script allows people to enter by using a form that asks for aUserID 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

Page 17: Drupal kurzus security (Drupal 7)

File inclusion

n File-t SOHA nem include-olunk URL alapjánn Triviális példa:

http://example.com/index.php?p=../../../../etc/passwd

http://example.com/index.php?p=index.php

Tuesday, April 3, 12

Page 18: Drupal kurzus security (Drupal 7)

Drupal biztonság

Tuesday, April 3, 12

Page 19: Drupal kurzus security (Drupal 7)

Alapok

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

Tuesday, April 3, 12

Page 20: Drupal kurzus security (Drupal 7)

Alapok

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

feladatainkat

Tuesday, April 3, 12

Page 21: Drupal kurzus security (Drupal 7)

Alapokn Minimális jogosultságok mindenkinekn A következő jogosultságok megadásával odaadjuk a

siteunkat:n Administer content typesn Administer usersn Administer permissionsn Administer filtersn Administer site configuration

Tuesday, April 3, 12

Page 22: Drupal kurzus security (Drupal 7)

Input formats

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

Tuesday, April 3, 12

Page 23: Drupal kurzus security (Drupal 7)

Access control

n Használd:n node_accessn user_accessn hook_menu

Tuesday, April 3, 12

Page 24: Drupal kurzus security (Drupal 7)

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_accessn 'access arguments'

n egy tömb, ami paraméterként adódik átn user_access esetén elég egy elem, a jogosultság

neveTuesday, April 3, 12

Page 25: Drupal kurzus security (Drupal 7)

hook_menu()n Rossz példa:

function hook_menu() {

return array(

'foobar' => array(

'access callback' => TRUE,

),

);

}Tuesday, April 3, 12

Page 26: Drupal kurzus security (Drupal 7)

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

Page 27: Drupal kurzus security (Drupal 7)

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

Page 28: Drupal kurzus security (Drupal 7)

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

Page 29: Drupal kurzus security (Drupal 7)

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

Page 30: Drupal kurzus security (Drupal 7)

SQL injection

n Nem megfelelően kezelt sztring beillesztése SQL lekérésbe

n Mindig kritikus hiba

Tuesday, April 3, 12

Page 31: Drupal kurzus security (Drupal 7)

SQL injection

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

n Ez ilyesztő

Tuesday, April 3, 12

Page 32: Drupal kurzus security (Drupal 7)

SQL injection

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

n Ez még ilyesztőbb

Tuesday, April 3, 12

Page 33: Drupal kurzus security (Drupal 7)

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

Page 34: Drupal kurzus security (Drupal 7)

SQL injection

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

$username%'

Tuesday, April 3, 12

Page 35: Drupal kurzus security (Drupal 7)

Feltöltött fájlokn Mindig ellenőrizni:

n méretn kiterjesztésn 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

Page 36: Drupal kurzus security (Drupal 7)

CSRF

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

Tuesday, April 3, 12

Page 37: Drupal kurzus security (Drupal 7)

CSRF

n Cross-site request forgery

Tuesday, April 3, 12

Page 38: Drupal kurzus security (Drupal 7)

Megelőzésn Ahol lehet, ott form api-t használnin 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

Page 39: Drupal kurzus security (Drupal 7)

XSS

n Cross site scripting

Tuesday, April 3, 12

Page 40: Drupal kurzus security (Drupal 7)

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

Page 41: Drupal kurzus security (Drupal 7)

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

Page 42: Drupal kurzus security (Drupal 7)

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

Page 43: Drupal kurzus security (Drupal 7)

Védekezés

n ”Csak” escape-elni kelln htmlspecialchars($text, ENT_QUOTES, 'UTF-8');n de nem szabad elfelejtenin nem kellene többször megcsinálnin abban a szövegben sem lesz markup, ahol kellene

lennie

Tuesday, April 3, 12

Page 44: Drupal kurzus security (Drupal 7)

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

Page 45: Drupal kurzus security (Drupal 7)

Megoldások

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

Tuesday, April 3, 12

Page 46: Drupal kurzus security (Drupal 7)

check_plain()

n plain text környezet:

<b> is not deprecatedn html környezet:

&lt;b&gt; is not deprecated

Tuesday, April 3, 12

Page 47: Drupal kurzus security (Drupal 7)

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

Page 48: Drupal kurzus security (Drupal 7)

check_url()

n URL környezet

http://asdf.com/?foo=42&bar=bazn HTML környezet

http://asdf.com/?foo=42&amp;bar=baz

Tuesday, April 3, 12

Page 49: Drupal kurzus security (Drupal 7)

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

Page 50: Drupal kurzus security (Drupal 7)

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

Page 51: Drupal kurzus security (Drupal 7)

filter_xss()

n Felhasználó által adott HTML

<img src=”javascript:doSomethingBad()” />n Biztonságos HTML

<img src=”doSomethingBad()” />

Tuesday, April 3, 12

Page 52: Drupal kurzus security (Drupal 7)

Mi mit vár

n HTMLn checkboxes #optionsn radios #optionsn l()n drupal_set_titlen drupal_set_messagen watchdog

n Sima szövegn select #optionsn l()

Tuesday, April 3, 12

Page 53: Drupal kurzus security (Drupal 7)

Mi mit vár

n HTMLn site missionn slogann footer

Tuesday, April 3, 12

Page 54: Drupal kurzus security (Drupal 7)

Mi mit vár

n Sima szövegn termekn felhasználónevekn tartalomtípusokn node név

Tuesday, April 3, 12

Page 55: Drupal kurzus security (Drupal 7)

Mi mit vár

n Rich textn comment bodyn node body

Tuesday, April 3, 12

Page 56: Drupal kurzus security (Drupal 7)

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 → HTMLn t('!var', array('!var' => $html));

Tuesday, April 3, 12

Page 57: Drupal kurzus security (Drupal 7)

.htaccess

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

Tuesday, April 3, 12

Page 58: Drupal kurzus security (Drupal 7)

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

Page 59: Drupal kurzus security (Drupal 7)

Példák sebezhetőségekre

n Sütiben felhasználónév vagy userid eltárolásan 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

Page 60: Drupal kurzus security (Drupal 7)

További olvasnivaló

n http://acko.net/blog/safe-string-theory-for-the-webn http://drupal.org/writing-secure-coden http://drupal.org/security-teamn http://owasp.orgn http://crackingdrupal.comn http://api.drupal.org

Tuesday, April 3, 12

Page 61: Drupal kurzus security (Drupal 7)

[email protected]

Belga-magyar cég

Közép-Európa egyik legjobb csapata

<15 fő

Utazás, csoki, sör

Tuesday, April 3, 12