Kavacky Posted December 10, 2004 Report Share Posted December 10, 2004 Pirmā problēma - neglīti izskatās rakstīts. Nav pareizi noformēts, grūti lasīt un vēl jo vairāk kļūdas meklēt. Link to comment Share on other sites More sharing options...
Venom Posted December 10, 2004 Report Share Posted December 10, 2004 if(!isset($_POST['name']) || $_POST['name']=='') vienāds ar if (empty($_POST['name'])) $_POST['passw']==md5($_SESSION['hash']) ? kas ir $_SESSION['hash']? Link to comment Share on other sites More sharing options...
Venom Posted December 10, 2004 Report Share Posted December 10, 2004 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 More sharing options...
Aleksejs Posted December 10, 2004 Report Share Posted December 10, 2004 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 More sharing options...
Venom Posted December 10, 2004 Report Share Posted December 10, 2004 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 More sharing options...
Venom Posted December 10, 2004 Report Share Posted December 10, 2004 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 More sharing options...
Aleksejs Posted December 10, 2004 Report Share Posted December 10, 2004 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 More sharing options...
Snukzz Posted December 10, 2004 Author Report Share Posted December 10, 2004 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 More sharing options...
Aleksejs Posted December 10, 2004 Report Share Posted December 10, 2004 Datubāzē parasti md5 attēli glabājas kā teksts. respektīvi ar simboliem pierakstīts kaut kas tjipa: AFF2341152DE28321EE33121231312 paroli tajos burtos nesaskatīt. Link to comment Share on other sites More sharing options...
Venom Posted December 10, 2004 Report Share Posted December 10, 2004 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 More sharing options...
Venom Posted December 10, 2004 Report Share Posted December 10, 2004 ... 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 More sharing options...
Snukzz Posted December 10, 2004 Author Report Share Posted December 10, 2004 Shito Venom lekciju vajadzeetu noglabaat PHP zelta fondaa! ;) Tas ir ko veerts! Link to comment Share on other sites More sharing options...
Aleksejs Posted December 10, 2004 Report Share Posted December 10, 2004 (edited) 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 December 10, 2004 by Aleksejs Link to comment Share on other sites More sharing options...
Snukzz Posted December 13, 2004 Author Report Share Posted December 13, 2004 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 More sharing options...
Snukzz Posted December 13, 2004 Author Report Share Posted December 13, 2004 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 More sharing options...
Recommended Posts