Moderators Dragos Posted August 29, 2017 Moderators Report 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
Moderators Dragos Posted August 30, 2017 Author Moderators Report 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
nimaarek Posted August 30, 2017 Report Posted August 30, 2017 @Dragos Can you answer the challenge? Quote
Moderators Dragos Posted August 30, 2017 Author Moderators Report 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
nimaarek Posted August 31, 2017 Report Posted August 31, 2017 I meant to answer the challenge write-up.. sry for bad eng Quote
adicode Posted September 2, 2017 Report 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