Moderators Dragos Posted August 29, 2017 Moderators Report Share Posted August 29, 2017 (edited) Salutări, Zilele trecute am făcut un audit pe o aplicaţie şi am descoperit o vulnerabilitate destul de interesantă, aşa că am zis să fac un web challenge pe partea asta. Scenariu Un programator a creat scriptul următor PHP care cere o parolă pentru a vedea conţinutul privat al site-ului: <?php $mysql = mysqli_connect("","","","") or die("Conexiune esuata la baza de date."); $par = htmlentities($_GET['par'],ENT_QUOTES); if(strlen($par) > 0) { $sql = $mysql->query("select * from passwords where password='$par'"); if($sql->num_rows > 0) { //continut privat }else{ echo "Parola nu a fost gasita in baza de date."; } }else{ echo "Se asteapta parola in parametrul GET <strong>par</strong>."; } După terminarea scriptului, el a adăugat în MySQL comanda următoare, uitând să completeze câmpul de parolă: INSERT INTO `passwords` (`ID`, `password`) VALUES (1, ''); În final, programatorul a făcut publică aplicaţia la adresa următoare: http://dragos.interinfo.ro/rst/chall/ Cerinţă Scopul exerciţiului este ca să treceţi de filtrările PHP şi să afişaţi conţinutul privat. Detalii tehnice scriptul este acelaşi şi pe host userul MySQL are doar drept de select şi are acces doar pe baza de date dedicată exerciţiului După ce aţi rezolvat Trimiteţi-mi un PM cu mesajul afişat în cadrul conţinutului privat şi linkul final şi vă voi adăuga în lista de mai jos. Cine a rezolvat până acum: - adicode - aleee - caii - dancezar - DLV - Gecko - Hertz - kandykidd - Matasareanu - Nytro - Pintilei - pr00f - Silviu - Sim Master - SirGod - theandruala - u0m3 - xenonxsc - yukti Edited October 25, 2017 by Dragos 1 7 Quote Link to comment Share on other sites More sharing options...
Moderators Dragos Posted August 30, 2017 Author Moderators Report Share Posted August 30, 2017 (edited) Pentru că m-aţi întrebaţi mulţi care e şpilul cu chall-ul, o să dau un exemplu real-case. În anumite platforme custom-made, scriptul de resetare a parolei arată ca cel de mai sus şi tabelul de utilizatori arată ceva de genul: ID | username | password | reset_token În momentul creării unei cereri noi de resetare, se generează un token pentru utilizator adăugat în reset_token în rândul cu utilizatorul. Utilizatorul accesează un link de genul următor reset.php?token=d41d8cd98f00b204e9800998ecf8427e&id=1 şi îi apare un formular în care să-şi introducă noua parolă pentru cont, după care câmpul reset_token se resetează. Utilizând vulnerabilitatea, putem reseta parola oricărui utilizator şi putem accesa platforma la nivel de administrator. Edited August 30, 2017 by Dragos 2 Quote Link to comment Share on other sites More sharing options...
nimaarek Posted August 30, 2017 Report Share Posted August 30, 2017 @Dragos Can you answer the challenge? Quote Link to comment Share on other sites More sharing options...
Moderators Dragos Posted August 30, 2017 Author Moderators Report Share Posted August 30, 2017 3 hours ago, nimaarek said: @Dragos Can you answer the challenge? The challenge was created by me, so yes. 1 Quote Link to comment Share on other sites More sharing options...
nimaarek Posted August 31, 2017 Report Share Posted August 31, 2017 I meant to answer the challenge write-up.. sry for bad eng Quote Link to comment Share on other sites More sharing options...
adicode Posted September 2, 2017 Report Share Posted September 2, 2017 Bai, a fost simplu dar sunt eu prost. Ma complicam la inceput sa inserez un alt query in parametrul par, dar nu avea rost pentru ca ghilimele. Ai pm, mersi de challenge. 2 Quote Link to comment Share on other sites More sharing options...