Jump to content
php.lv forumi

4ortavas sesijas


Snukzz

Recommended Posts

  • Replies 46
  • Created
  • Last Reply

Top Posters In This Topic

un ko tu pārbaudi?

MD5(CONCAT(passw,\''.mysql_real_escape_string($_SESSION['hash']).'\'))=\''.user_texc($_POST['passw'],33,255,1,1).'\'')

 

vai md5 no ievadīta stringa sql pusē ir vienāds ar php pusē ievadīto?

 

domāts ka tabulā

id|user|hash

1|nick|sadasddsad0213798ysdiuasd8768

 

un tad ir "SELECT ... WHERE `nick`='".$_POST['nick']."' AND `hash`='".md5($_POST['passw'])."'"

 

NB: $_SESSION['id']=$row[0];

$_SESSION['name']=$row[1];

 

vieglāk raxtīt

 

list($_SESSION['id'],$_SESSION['name'])=$row;

 

 

NNB: samazinām query skaitu, paroles pārbaude ar uzreizīgo NOW() ielikšanu

un tad ir "UPDATE tabula SET pedac=NOW() WHERE `nick`='".$_POST['nick']."' AND `hash`='".md5($_POST['passw'])."'"

un pārbaudām vai ir affected (mysql_num_rows vai kā tur bija, darbojos ar savu klasi, piemirsās standarta)

 

MYSQLā var izmantot OR

 

"UPDATE tabula SET pedac=NOW() WHERE (`nick`='".$_POST['nick']."' AND `hash`='".md5($_POST['passw'])."') OR (pārbaude no session hasha)"

 

NNNB: protams, var katru reizi pārbaudīt sesijā saglabāto hashu pret mysql, bet vai pati hasha esamība sessijā neliecina par to, ko autentifikācija reiz notikusi? un sesijas norepleisot nav tik viegli

 

NNNNB: if ($logerror=1) - ja mainīgam var piešķirt vērtību, ko var izdarīt vienmēr. tu gribēji ==

 

uz pirmā acu skatiena

Link to comment
Share on other sites

pārāk paranoidāli, neesmu redzējis nevienu efektīvu metodi md5 atkodēšanai

(nb: kādam nav pāris simtu terabaitu?)

Manuprāt nekā īpaši paranoidāla nav, jo:

1) Sarežģītība paliek tāda kāda bija

2) Nekādas atšķirības nav, vai glabāt vienkārši md5(), vai arī md5() vairākkārtējus attēlus

3) md5() vietā jau sen iesaka lietot sha() (ja sha() būtu standartfunkcija, kas būtu pieejama bez papaildus muduļiem, sen jau vajadzētu izmantot to).

4) ir pieejamas ļoti optimizētas gatavas programmas, kas ar pilno pārlasi meklē izmantotās atslēgas, ja tiek izmantota vienkārša hash funkcija. Vairākkārtēju hash attēlu pārbaudei plašai publikai pieejama labi optimizēta programma man nav zināma.

5) Neļauj izmantot universālas iepriekšizrēķinātas hash tabulas.

Link to comment
Share on other sites

check this out!

 

session_start();

if (!isset($_SESSION['hash']))

$_SESSION['hash']='';

 

if (empty($_SESSION['hash']) && (!empty($_POST['usr']) && !empty($_POST['pwd'])))

{

$q=mysql_query("UPDATE tabula SET

pedeja_riciba=NOW(),

apraksts='login'

WHERE

`login_name`='".mysql_escape_string($_POST['usr'])."'

AND `pwd_hash`='".md5($_POST['pwd'])."'");

if (mysql_affected_rows($q))

$_SESSION['hash']=$_POST['usr'];

}

else

//jau autorizējies

echo 'Sveiki, '.$_SESSION['hash'];

Link to comment
Share on other sites

Aleksejs:

"apgriežot" md5( $username . md5( $username . md5( $username . $password . $salt) . $password . $salt) . $password . $salt);

tik un tā ar cilvēkaci būs saskatāms k-kas līdzīgs

 

janiskjl231ljlk213k213kljtikaicilveks3244325

 

arī ja tur būs kas cits, kā tikaicilveks, no atlikušā "kazja-bazja" var ņemt dažāda garuma substingus un mēģināt kā paroles

 

izeja:

nesaprotami lietotājvārdi un paroles, kas paši izskatās pēc nohashotās vērtības, e.g. ?4545%,lh213jkhk21jk

ļoti gari abi, lai rēķinātos ilgi jo ilgi

 

un citi kriptogrāfijas wunderi

Link to comment
Share on other sites

Aleksejs:

"apgriežot" md5( $username . md5( $username . md5( $username . $password . $salt) . $password . $salt) . $password . $salt);

tik un tā ar cilvēkaci būs saskatāms k-kas līdzīgs

 

janiskjl231ljlk213k213kljtikaicilveks3244325

 

arī ja tur būs kas cits, kā tikaicilveks, no atlikušā "kazja-bazja" var ņemt dažāda garuma substingus un mēģināt kā paroles

 

izeja:

nesaprotami lietotājvārdi un paroles, kas paši izskatās pēc nohashotās vērtības, e.g. ?4545%,lh213jkhk21jk

ļoti gari abi, lai rēķinātos ilgi jo ilgi

 

un citi kriptogrāfijas wunderi

Ko nozīmē apgriežot?

Datubāzē šajā gadījumā glabājās pēc izskata līdzīga 32 (vai cik tur) hex simbolu virkne.

Teiksim 12ad45eef03211ac12ad45eef03211ac

šī virkne savukārt tika izveidota, kā:

md5(aleksejs137ac5dd2ee5137ac5dd2ee5137ac5dd2ee5AleksejaParoleSālsveertiiba), utt...

Link to comment
Share on other sites

pag... tip domaats, ka datu baazee glabaajas sagjeneerta kautkaada isteiksme, kuru pie ielogoshanaas saliidzina ar logoshanaas laikaa gjenereeto- pareizi? ;) Un arii vai ta md5 savaa virknee glabaa gatavas fraazes - resp paroli piem. paroleeec1cd3c322f2c32e2c3e jeb arii paargjeneree pa savam vienkaarshi : ec11c1efec1fec2fecef1ecfe. cik saprotu datu baazee vinhs glabaajas kaa BLOB's netaa? :ph34r:

Link to comment
Share on other sites

ko nozīmē "apgriežot"

 

tas, ka datu bāzē tu glabāsi hashu no "parole", vai "janislkslkjhadlkjadparole" ir būtībā vienalga (izņemto to, ka otrā variantā parole ir garāka, kas ir labāk un grūtāk atkožams), jo md5 nav cikliska funkcija, t.i. ja tu vari atgriest vērtību sākotnējo no vērtību no md5('parole') hasha (resp. parole) - tāpatās arī varēsi "apgriezt otrādi" arī "janislkslkjhadlkjadparole". Katram flip atbilst tikai viens flop. t.i., ja es atrodu kādu simbolu kombināciju, kuras md5 ir vienāds ar datu bāzē saglabāto, tad ar 99.99% pārliecību varu teikt, ka tā satur izejas stringu. Tavā piemērā parole tik un tā tiek iebliezta pa tīro un acīm saskatāma, ja tā būtu vismaz str_rot13-tēta, tad nebūtu preteziju liekkodībai ;) (t.i. arī atkožot md5 hakeris uzreiz neredz paroli tīrā veidā, kādu varētu ievadīt sistēmas interfeisā).

 

Att. uz būtību:

 

kad lietotājs reģistrējas, datu bāzē tiek saglabāts (char(32) laukā) md5() no ievadītās paroles, t.i. parole tīrā veidā netiek glabāta d.b.

md5 būtība ir tāda, ka vienam stringam atbilst viens un tikai viens hashs (ok, ir nebūtiska varbūtība, ka viens hashs varētu atbilst diviem dažādiem vārdiem/teikumiem), resp. nevar notikt tā, ka nokodējot teikums1 un teikums2 hash1 būtu vienāds ar hash2.

 

Kad lietotājs ievada paroli pārbaudei - tu noģenerē ar php no tās md5 hashu, un salīdzini, vai tas ir vienāds ar db glabāto. Ja tā ir, ar 99.99% pārliecību tu vari teikt, ka ievadītā šoreiz parole ir tieši tā, kas tika izmantota reģistrācijai, t.i. ir patiesa.

 

Arī nozogot datu bāzi nevarēs pateikt, kādas bija izejparoles (kas ir svarīgi, ja tās tiek izmantotas vairākās vietās), resp. tiek nograuta tikai viena komponente, nevis visa sistēma. Cits jautājums, ja datu bāzē to var nomainīt pret savu md5 hashu, bet nevar piekļūt pašam php/whateva kodam, kas pārbauda autentifikāciju. Un ŠĀDĀ gadījumā es piekrītu Aleksejam - ka jāliek klāt kaut kāds "slepens" papildinātājs jau programmā, ko nezinot, nevar nogēnerēt md5 no stringa, kas turpmāk atbilstu nosacījumiem. Cita lieta atkal ja gribi savienot vairākas komponentes kopā (Single Sign On, kādu es piem. izmantoju ltta.lv lapā, kur ar vienu paroli var piekļūt gan administrēšanai, gan čatam, ko neesmu taisījis es, jo tiek izmantota vienāda shēma). Bet arī šeit būtu jāpielieto otrā līmeņa kodēšana, kā esmu norādījis augstāk. Resp. ja hakeris redz 32-simbolu zīmi un saprot, ka tas ir md5 un viņam/i pie tam izdodas to atkodēt, viņš redz "manaparole" - bet ar to nevar ieiet, paņem atkodē kādu otro, un tā ir "manacitaparole", viņš sapratīs, ka formā jāievada tieši beigu daļa, bet "mana" tiek pielikts automātiski. Ja atkodējot md5 viņš saņems atkal 32 simbolu virkni, ir pamats domāt kā izejas kodā stāv md5(md5($password)).

Tas saucas idejiskais reverse-engineerings.

 

Svarīgi iekš kvērija nodot jau noģenerēto hashu, lai SQL pieprasījums beigu variantā izskatītos kā WHERE kolonna='ksjdk2g23i4e3g8yagiuhbjahsbd', nevis kā taisa daži "grudrinieki" - WHERE kolonna=MD5('parole'). Rezultāts ta ir viens un tas pats, ar to atšķirību, ka pa tīklu var nočiept

Link to comment
Share on other sites

... sūtāmo SQL stringu, t.i. hakeris uzreiz rokās dabūs paroli tīrā veidā.

Var arī neanalizēt net trafiku, bet nočiept sql servera logus, kurā dažkārt tiek pierakstīti pieprasījumi (piem. admins grib atrast kādu procesu, kas gāž nost db, ieslēdz query loggingu un tājā parādās parole tīrā veidā).

 

Autentifikācija uz md5($pwd) [kur $pwd ir tieši tas, ko ievada lietotājs] pamata bāzes pēdējos gados ir kļuvusi par standartu, kas ļauj taisīt t.s. one-point ielogošanas sistēmas, jebšu Single Sign-On solutions no "komponentēm", ko ir taisījuši dažādi izstrādātāji. Resp. lietotājs ienāk forumā, es sesijā saglabāju md5 hashu (t.i. arī nočiepot sessiju nepiekļūst parolei tīrā veidā), nobrauzējot uz pasta pārbaudes web-interfeisu es vienkārši ureiz piesaku hashu un lietotājam nav otrreiz jāievada tā pati parole (iekš VeA esmu taisījis virkni - mans forums, phpBB, squirrelmail, ienākot jebkurā varēja brīvi pārvietoties starp visiem).

Link to comment
Share on other sites

Turpinām lekciju (-;

...

Katram flip atbilst tikai viens flop. t.i., ja es atrodu kādu simbolu kombināciju, kuras md5 ir vienāds ar datu bāzē saglabāto, tad ar 99.99% pārliecību varu teikt, ka tā satur izejas stringu. Tavā piemērā parole tik un tā tiek iebliezta pa tīro un acīm saskatāma, ja tā būtu vismaz str_rot13-tēta, tad nebūtu preteziju liekkodībai wink.gif (t.i. arī atkožot md5 hakeris uzreiz neredz paroli tīrā veidā, kādu varētu ievadīt sistēmas interfeisā).

...

Nepiekrītu, jo tikpat labi, hakeris redz, ka iekš PHP ir izmantots nevis md5(parole) bet gan md5(rot13(parole)). Jēga no rot(13) būtu, ja to izmantotu jau klienta pusē - tas ir visdrīzāk ar JavaScript, bet tādā gadījumā, ja JavaScript izmantošana ir pieņemama, mēs vispār varam izmantot aes() JavaScript realizāciju un mums paverās iespēja realizēt jau kādu ChallengeResponse protokolu.

Arī nozogot datu bāzi nevarēs pateikt, kādas bija izejparoles (kas ir svarīgi, ja tās tiek izmantotas vairākās vietās), resp. tiek nograuta tikai viena komponente, nevis visa sistēma.

Jā, bet nozogot citā vietā līdzīgu datubāzi, ja tiek izmantots pliks md5(parole) uzreiz ir redzams, kuras paroles ir vienādas. Tas pats attiecas uz vienādām parolēm vienas datubāzes robežās.

Bet arī šeit būtu jāpielieto otrā līmeņa kodēšana, kā esmu norādījis augstāk. Resp. ja hakeris redz 32-simbolu zīmi un saprot, ka tas ir md5 un viņam/i pie tam izdodas to atkodēt, viņš redz "manaparole" - bet ar to nevar ieiet, paņem atkodē kādu otro, un tā ir "manacitaparole", viņš sapratīs, ka formā jāievada tieši beigu daļa, bet "mana" tiek pielikts automātiski. Ja atkodējot md5 viņš saņems atkal 32 simbolu virkni, ir pamats domāt kā izejas kodā stāv md5(md5($password)).

Jā, bet vairākkārtēja hashoshana, dod to, ka nav gatavas optimizētas ātras programmas, kas veic pilno pārlasi (ar vai bez vārdnīcas) - tātad hakerim IR grūtāk nekā standarta gadījumā. Protams neviena no šīm metodēm neaizsargā, ja lietotājs ir izvēlējies vienkāršu, īsu paroli. Bez tam, ja tiek izmantota vairākkārtēja hashošana hakerim ir jāveic uzreiz visa h(h(h(p))) kaskāde, jo salīdzināt jau viņš var tikai ar visas kaskādes vērtību - starprezultātus jau viņš nezin un tas arī būtu pārāk darbietilpīgi vispirms atrast tādu 32 simbolu virkni G, kura dod G = h(h(p)), tad meklēt tādu N, ka N = h(parole) un visbeidzot atrast tādu paroli, kuras hash vērtība būtu vienāda ar N

Svarīgi iekš kvērija nodot jau noģenerēto hashu, lai SQL pieprasījums beigu variantā izskatītos kā WHERE kolonna='ksjdk2g23i4e3g8yagiuhbjahsbd', nevis kā taisa daži "grudrinieki" - WHERE kolonna=MD5('parole'). Rezultāts ta ir viens un tas pats, ar to atšķirību, ka pa tīklu var nočiept

Vispār jau vieglāk ir nočiept brīdī, kad lietotājs sūta HTML POST datus, kuri (ja nav izmantots SSL) arī ir nešifrētā veidā. Ja jau ir pieeja MySQL logiem, tad pat, ja izmanto SSL, var norādīt Web serverim, lai tas logo visus atsūtītos datus...

Autentifikācija uz md5($pwd) [kur $pwd ir tieši tas, ko ievada lietotājs] pamata bāzes pēdējos gados ir kļuvusi par standartu, kas ļauj taisīt t.s. one-point ielogošanas sistēmas, jebšu Single Sign-On solutions no "komponentēm", ko ir taisījuši dažādi izstrādātāji. Resp. lietotājs ienāk forumā, es sesijā saglabāju md5 hashu (t.i. arī nočiepot sessiju nepiekļūst parolei tīrā veidā), nobrauzējot uz pasta pārbaudes web-interfeisu es vienkārši ureiz piesaku hashu un lietotājam nav otrreiz jāievada tā pati parole (iekš VeA esmu taisījis virkni - mans forums, phpBB, squirrelmail, ienākot jebkurā varēja brīvi pārvietoties starp visiem).

Lūk šim gan es piekrītu.

Edited by Aleksejs
Link to comment
Share on other sites

Nujaa... kaads apskaidrojiet kaadeelj met aaraa shitaadu erroru, kaa to noveerst:

Notice: A session had already been started - ignoring session_start() in ....whatever

Link to comment
Share on other sites

Man ir pamatiigas aizdomas, ka man nemaz sesiju pienaaciigi nesaglabaa, resp. logoshanaas skriptam pietruukst datu! Taa var buut , ka sesija saglabaa kaut kaadu shitaadu virkni:

ip|s:9:"127.0.0.1";hash|s:8:"Td4$ўy4Б";

Link to comment
Share on other sites


×
×
  • Create New...