007007 Posted July 21, 2012 Report Share Posted July 21, 2012 (edited) Par NullByte darbību ārzemju resursos atradu tikai diezgan ierobežotu informāciju.. Vai varat padalīties ar info, kad tas darbojas, kad nē utt? Būtībā cik saprotu vissāpīgākā vieta ir iespēja iespaidot include(); funkciju, ja tajā ievieto GET datus, ko gan es nekad tāpat nedarītu, bet piemēra pēc. Piemēram, šis kods: <?php if($_GET['file_to_inc']){ include($_GET['file_to_inc'].'.php'); } else{ echo 'File to include is not specified yet.'; } ?> Ievadot browserī: "http://localhost/first/index.php?file_to_inc=firstfile.txt%00" , tam vajadzētu atvērt manu eksistējošo firstfile.txt , jo NullBytam būt jālikvidē php kodā pievienotais .php paplašinājums. Tomēr tā nenotiek un saņemu lejāk esošo erroru. Tajā .php itkā it dzēsies, bet fails neievietpjas.. Kādēļ tas nestrādā? "Warning: include() [function.include]: Failed opening 'firstfile.txt' for inclusion (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\first\index.php on line 3" Edited July 23, 2012 by 007007 Quote Link to comment Share on other sites More sharing options...
Mr.Key Posted July 21, 2012 Report Share Posted July 21, 2012 (edited) Vai šis izdod tādu pašu rezultātu? include $_GET['file_to_inc'] . '.php'; Edit: Nupat pamēģināju, strādā gan tā, gan tā. Droši vien nevar atrast failu, skaties, vai tas ir novietots tajos ceļos, kas minēti kļūdas ziņojumā. Edited July 21, 2012 by Mr.Key Quote Link to comment Share on other sites More sharing options...
briedis Posted July 21, 2012 Report Share Posted July 21, 2012 (edited) nu bet duh, paskaties savu kodu nedaudz cītīgāk: include($_GET['file_to_inc']) . '.php'; Saproti, kas tur notiek? Tu iekļauj failu no $_GET, un veic include() funkcijas atgrieztās vērtības konkatenāciju ar '.php'. Tāpēc vienmēr vajadzētu operatoriem likt priekšā/pakaļā atstarpes, lai neveidojas šādas muļķīgas kļūdas. Likt $_GET iekš include arī supermuļķīgi. Izmantojam whitelist principu šādos gadījumos (ja vien tas nav dinamisks gadījums. Tad attiecīgi vajadzētu validēt/filtrēt šo vērtību) Edited July 21, 2012 by briedis Quote Link to comment Share on other sites More sharing options...
Mr.Key Posted July 22, 2012 Report Share Posted July 22, 2012 nu bet duh, paskaties savu kodu nedaudz cītīgāk: include($_GET['file_to_inc']) . '.php'; Saproti, kas tur notiek? Tu iekļauj failu no $_GET, un veic include() funkcijas atgrieztās vērtības konkatenāciju ar '.php'. Ne gluži. "Because include is a special language construct, parentheses are not needed around its argument. Take care when comparing return value. " (http://lv.php.net/manual/en/function.include.php) Tātad, tiek izpildīts include ar iekavu vērtību, kas savienota ar tekstu '.php'. Tāpēc vienmēr vajadzētu operatoriem likt priekšā/pakaļā atstarpes, lai neveidojas šādas muļķīgas kļūdas. Pievienojos p.s. Ko tik jaunu neizdodas uzzināt katru dienu... Quote Link to comment Share on other sites More sharing options...
007007 Posted July 23, 2012 Author Report Share Posted July 23, 2012 (edited) . Edited July 23, 2012 by 007007 Quote Link to comment Share on other sites More sharing options...
007007 Posted July 23, 2012 Author Report Share Posted July 23, 2012 nu bet duh, paskaties savu kodu nedaudz cītīgāk: include($_GET['file_to_inc']) . '.php'; Saproti, kas tur notiek? Tu iekļauj failu no $_GET, un veic include() funkcijas atgrieztās vērtības konkatenāciju ar '.php'. Tāpēc vienmēr vajadzētu operatoriem likt priekšā/pakaļā atstarpes, lai neveidojas šādas muļķīgas kļūdas. Likt $_GET iekš include arī supermuļķīgi. Izmantojam whitelist principu šādos gadījumos (ja vien tas nav dinamisks gadījums. Tad attiecīgi vajadzētu validēt/filtrēt šo vērtību) Ne gluži. "Because include is a special language construct, parentheses are not needed around its argument. Take care when comparing return value. " (http://lv.php.net/ma...ion.include.php) Tātad, tiek izpildīts include ar iekavu vērtību, kas savienota ar tekstu '.php'. Pievienojos p.s. Ko tik jaunu neizdodas uzzināt katru dienu... Atvainojos jums abiem par tāda veida '.php' konkatenāciju. Bet problēma nepazūd, ja to labo, un faili ir vietās. Patiesībā include funkcija parasti dod divus errorus -viens par to, ka fails neeksistē, un otrs tālāk izrietošs, ka failu nevarēja iekļaut. Lūk, kā man te ir: 1. veids. browserī ievadu (bez NullByte): "http://localhost/fil...to_inc=file.txt" Warning: include(file.txt.php): failed to open stream: No such file or directory in C:\xampp\htdocs\files\index.php on line 6 Warning: include(): Failed opening 'file.txt.php' for inclusion (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\files\index.php on line 6 2.veids. browserī ievadu(ar NullByte): "http://localhost/fil...inc=file.txt%00" Warning: include(): Failed opening 'file.txt' for inclusion (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\files\index.php on line 6 Kā redzams,pirmajā veidā include funkcija saņem "file.txt.php" un pirmais errors saka, ka tāds fails neeksistē (tā arī ir). Otrajā veidā, pateicoties nulbytam, include funckija saņem jau vairs tikai "file.txt" un vairs nav errora par to, ka fails neeksistē (jo tas eksistē), bet saglabājas errors, ka to nevar atvērt. Kāpēc tā notiek? Quote Link to comment Share on other sites More sharing options...
briedis Posted July 23, 2012 Report Share Posted July 23, 2012 Tāpēc, ka nulltais baits nekur nepazūd, un, tas, ka viņu nevar redzēt, nenozīmē, ka viņa tur nav. Paskaties šo manu piemēru: http://codepad.org/i6FShD0A Kā redzi, virkņu garumi atšķiras, bet pēc skata virknes ir vienādas: string(9) "file.txt" string(8) "file.txt" Quote Link to comment Share on other sites More sharing options...
waplet Posted July 23, 2012 Report Share Posted July 23, 2012 Tādā gadījumā , kad nostrādās null byte lfi :? tad tur pašam ir jālasa ārā , liekie baiti, :D lai kaut kas tāds nostrādātu :D ķipa strip bytes :D Quote Link to comment Share on other sites More sharing options...
briedis Posted July 23, 2012 Report Share Posted July 23, 2012 Nafig vispār jāstreso par kaut kādu nullto baitu? Validējam vērtības pēc white-list principā un miers. Quote Link to comment Share on other sites More sharing options...
Mr.Key Posted July 23, 2012 Report Share Posted July 23, 2012 (edited) Nē nu interesanti. Bet es pamēģināju, man viss notikās kā vajag, respektīvi, ar null byte URLī include sekmīgi nostrādāja. Tas gan uz Win. Briedis, null byte nekur nepazūd, bet triks ir tāds, ka C (??? neesmu drošs) funkcijas izmanto viņu, lai noteiktu, ka tās ir string beigas, PHP saprot, ka tas ir strings ar 9 simboliem, bet C funkcija ielādē stringu buferī, lasa līdz null baitam.. :) Edited July 23, 2012 by Mr.Key Quote Link to comment Share on other sites More sharing options...
briedis Posted July 23, 2012 Report Share Posted July 23, 2012 Briedis, null byte nekur nepazūd, bet triks ir tāds, ka C (??? neesmu drošs) funkcijas izmanto viņu, lai noteiktu, ka tās ir string beigas, PHP saprot, ka tas ir strings ar 9 simboliem, bet C funkcija ielādē stringu buferī, lasa līdz null baitam.. :) Jā, par C ievainojamību esmu dzirdējis, bet tieši PHP sakarā gan nē... Ja paskatās php.net, tad tur arī īpaši nekas par šo nav teikts(http://php.net/manual/en/security.filesystem.nullbytes.php), tik vien kā, ka var rasties problēmas failu sistēmas gadījumā, bet kurš tad ar veselu saprātu liek nepārbaudītus lietotāja datus iekš include vai require... Quote Link to comment Share on other sites More sharing options...
Mr.Key Posted July 23, 2012 Report Share Posted July 23, 2012 Vairāk jau izskatās pēc eksperimentiem/mācībām :) Lai saprastu, kā pulkstenis strādā, reizēm tas ir jāizjauc un jāpabaksta kāds zobrats. Visinteresantāk ir tad, kad atsperes aizlido pa gaisu un viss jāsaliek kopā. Quote Link to comment Share on other sites More sharing options...
daGrevis Posted July 24, 2012 Report Share Posted July 24, 2012 > bet triks ir tāds, ka C (??? neesmu drošs) Jap, C. Quote Link to comment Share on other sites More sharing options...
007007 Posted July 24, 2012 Author Report Share Posted July 24, 2012 (edited) Jā, tā ir Sī valoda.. Cik zinu, php kompilators rakstīts tajā, un null byts apzīmē līnijas beigu, jo tur string datus ievada kā array, kur katrs elements ir viena rakstzīme no string.. Un jā, šīs ir mācības.. Lai saprastu kā no tā izsargāties, jāsaprot, kas nedarbosies.. Bet nesanāk man to savu skriptu uzlauzt tā kā gribētos. Ja nu tas ko dod, tad lietoju php 5.4.4. caur XAMP lokālā servera instalāciju uz Win7 Es būtu baigi pateicīgs ja kāds iedotu jau gatavu tādu, uz kuru tas null byts darbojas tā kā es gribu. Lai var izpētīt.. Edited July 24, 2012 by 007007 Quote Link to comment Share on other sites More sharing options...
007007 Posted July 24, 2012 Author Report Share Posted July 24, 2012 Jā, par C ievainojamību esmu dzirdējis, bet tieši PHP sakarā gan nē... Ja paskatās php.net, tad tur arī īpaši nekas par šo nav teikts(http://php.net/manua...m.nullbytes.php), tik vien kā, ka var rasties problēmas failu sistēmas gadījumā, bet kurš tad ar veselu saprātu liek nepārbaudītus lietotāja datus iekš include vai require... Ir, ir ievainojamība.. Kā jau minēju php kompilators rakstīts C. tāpēc ja problēmas C, tad problēmas arī php. I-netā var atrast funkcijas, kuras php nav drošas pret šo. include vistrakākā. Un protams ka es lietošu white-listus, bet šeit vienkārši čakarēju to, kas lācītim vēderā.. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.