Drupal biztonság
Tuesday, April 3, 12
Ki célpont?
Tuesday, April 3, 12
”mi nem vagyunk célpontok” n
n
n
n
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ó :)
Tuesday, April 3, 12
Ki célpont?
Mindenki Tuesday, April 3, 12
Biztonságról általában n
n
n
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.
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
n
SSL-lel titkosított protokollok használata: n
FTPS
n
SFTP
n
HTTPS
n
SSH
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
Tuesday, April 3, 12
safe_mode kikapcsolása (hamis biztonságérzet, gyakorlatban nem sokat véd)
Formok biztonsága
n
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) 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
n
n
n
Í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
Tuesday, April 3, 12
HTTP kérések
n
n
Érzékeny adatot URL-ben soha http://example.com/register.php?
[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
JavaScript n
Valós életből vett ellenpélda: <script language="javascript">
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
Tuesday, April 3, 12
Hosszú távon úgyis gyorsabban végezzük el a feladatainkat
Alapok n
n
Minimális jogosultságok mindenkinek A következő jogosultságok megadásával odaadjuk a siteunkat:
Tuesday, April 3, 12
n
Administer content types
n
Administer users
n
Administer permissions
n
Administer filters
n
Administer site configuration
Input formats
n
Amit csak nagyon megbízható felhasználóknak engedünk:
Tuesday, April 3, 12
n
Full HTML
n
PHP
Access control n
Használd:
Tuesday, April 3, 12
n
node_access
n
user_access
n
hook_menu
hook_menu() n
'access callback' n
n
n
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' n
n
Tuesday, April 3, 12
egy tömb, ami paraméterként adódik át user_access esetén elég egy elem, a jogosultság neve
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
n
Nem megfelelően kezelt sztring beillesztése SQL lekérésbe Mindig kritikus hiba
Tuesday, April 3, 12
SQL injection
n
n
mysqli_query(”SELECT * FROM node WHERE nid = ” . $_GET['nid']);
Ez ilyesztő
Tuesday, April 3, 12
SQL injection
n
n
mysqli_query(”SELECT * FROM node WHERE nid = ” . $_REQUEST['nid']);
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
n
Nem SQL injection, de sok kezdő fejlesztő beleszalad SELECT * FROM ”user” WHERE ”name” LIKE '% $username%'
Tuesday, April 3, 12
Feltöltött fájlok n
n
n
Mindig ellenőrizni: n
méret
n
kiterjesztés
n
felbontás (képek esetén)
file_check_location() Lehetőleg soha ne include-oljunk felhasználó által feltöltött fájlt
Tuesday, April 3, 12
CSRF
Tuesday, April 3, 12
CSRF
n
Cross-site request forgery
Tuesday, April 3, 12
Megelőzés n n
Ahol lehet, ott form api-t használni 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 = '
' . $node->title . ''; return $output;
n
Mi van, ha a node címe a következő? '<script>alert(”U R H4XXD LULZ”); '
Tuesday, April 3, 12
XSS
n
n
Nem csak vicces dialógusok feldobálásra való 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
Tuesday, April 3, 12
abban a szövegben sem lesz markup, ahol kellene lennie
Problémák n
A környezet más értelmet ad a jeleknek I CAN HAZ
CHEEZBURGER LULZ!
is not deprecated <span attribute=”$foo”>$bar
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: is not deprecated
n
html környezet: is not deprecated
Tuesday, April 3, 12
check_markup() n
Rich text környezet [#8] foobar \n baz
n
HTML környezet node/8 foobar
baz
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&bar=baz
Tuesday, April 3, 12
filter_xss() n
Felhasználó által adott HTML
foo
<script>alert('bar');
n
Biztonságos HTML
foo
alert('bar');
Tuesday, April 3, 12
filter_xss() n
Felhasználó által adott HTML
n
Biztonságos HTML
Tuesday, April 3, 12
filter_xss() n
Felhasználó által adott HTML
n
Biztonságos HTML
Tuesday, April 3, 12
Mi mit vár n
HTML n n n n n n
Tuesday, April 3, 12
n
checkboxes #options radios #options l() drupal_set_title drupal_set_message watchdog
Sima szöveg n
select #options
n
l()
Mi mit vár n
HTML
Tuesday, April 3, 12
n
site mission
n
slogan
n
footer
Mi mit vár n
Sima szöveg
Tuesday, April 3, 12
n
termek
n
felhasználónevek
n
tartalomtípusok
n
node név
Mi mit vár
n
Rich text
Tuesday, April 3, 12
n
comment body
n
node body
t() n
Plain text → HTML n
t('@var', array('@var' => $plain_text)); n
n
t('%var', array('%var' => $plain_text)); n
n
@: plain text %: kiemelt szöveg
HTML → HTML n
Tuesday, April 3, 12
t('!var', array('!var' => $html));
.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
Webshopnál az áru mennyisége nem ”1”, hanem ”.1”
n
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
n
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.
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
[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