drupal kurzus security (drupal 7)
DESCRIPTION
TRANSCRIPT
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ékesekn 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á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
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
Í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 FTPSn SFTPn HTTPSn SSH
n VPN
Tuesday, April 3, 12
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
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é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
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
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
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
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
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-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
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
Input formats
n Amit csak nagyon megbízható felhasználóknak engedünk:n Full HTMLn PHP
Tuesday, April 3, 12
Access control
n Használd:n node_accessn user_accessn 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_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
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ő beleszaladn SELECT * FROM ”user” WHERE ”name” LIKE '%
$username%'
Tuesday, April 3, 12
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
CSRF
<img src=”http://drupal.org/logout”/>
Tuesday, April 3, 12
CSRF
n Cross-site request forgery
Tuesday, April 3, 12
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
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 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
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 deprecatedn html környezet:
<b> 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=bazn HTML környezet
http://asdf.com/?foo=42&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 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
Mi mit vár
n HTMLn site missionn slogann footer
Tuesday, April 3, 12
Mi mit vár
n Sima szövegn termekn felhasználónevekn tartalomtípusokn node név
Tuesday, April 3, 12
Mi mit vár
n Rich textn comment bodyn 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 → HTMLn 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égetn 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á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
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
Belga-magyar cég
Közép-Európa egyik legjobb csapata
<15 fő
Utazás, csoki, sör
Tuesday, April 3, 12