Rozwal.to - podstawowka_5.php

0

Witam

Próbuje swoich sił w rozwalaniu zadanek na rozwal.to.
Mam problem z rozwaleniem zadania z sekcji podstawówka (zadanko z PHP): http://training.securitum.com/rozwal/podstawowka/podstawowka_5.php

kod zródłowy strony:

<?php		
	for($f=file(__FILE__),$i=0;$i<7;$i++) echo $f[$i];
	eval('function a'.time().'a() { print_flag(); }');
	if (isset($_GET['a'])) eval('a'.(int)$_GET['a'].'a();');
	die();

Kod PHP rozumiem.

  • Pierwsza linijka wypisuje kod zródłowy pliku PHP.
  • Druga linijka tworzy funkcje ktora w nazwie ma timestamp
  • A trzecia linijka kodu sprawdza $_GET['a'] i wysyla do funkcji a<timestamp>a

Napisalem prosty kod HTML + JAVASCRIPT:

<script type="text/javascript">
function func1(){
	var d = new Date();
	var n = Math.floor((d.getTime() / 1000)); // get the seconds, not milliseconds
	document.getElementById("a").value = n;
}

</script>
<form action="http://training.securitum.com/rozwal/podstawowka/podstawowka_5.php" method="GET" onsubmit="func1()">
<input type="test" value="" name="a" id="a" />
<input type="submit" value="Submit"  />
</form>

Forma wysyła timestamp taki jaki zostanie wygenerowany na moim web serverze.
Niestety nie działa to na http://training.securitum.com/rozwal/podstawowka/podstawowka_5.php

Nastepnie probowalem wstrzyknąc w GET funkcje time()

  • kod taki jak ten eval('echo('.$_GET['a'].');'); by zwrocil timestamp
  • ale aplikacja zwraca 0 bo value z $_GET['a'] jest zamieniany na int najpierw: eval('a'.(int)$_GET['a'].'a();');

Prosze o pomoc i z góry dziękuje ;)

0

Zgodnie z regulaminem zabawy niestety nie możemy Ci pomóc.

0

Pisałem ci już ostatnio, że w ten sposób to się niczego nie nauczysz.

0

Nie szukam rozwiązania ale podpowiedzi.
Czy mozna zrobic eval(eval()) (nested eval)?

0

Próbowałem dostać sie do flagi poprzez wstrzykniecie kodu do funkcji "eval", ale nie jest to proste i niestety nie wychodzi mi.
Z tego co widze po kodzie to widomo że flaga jest w fukcji print_flag() i zamiast wywoływania funkcji
a'.time().'a() mozna by spróbować wywołać funkcje print_flag().

Problem natomiast stwarza budowanie stringu przez eval ('a' . (int) ..... .'a();' ):
eval('a'.(int)$_GET['a'].'a();');
a wszysto wysłane GETem jest wysłane jako string i nie wykonuje się po stronie servera.

Byłoby dużo latwiej jakby zamiast eval('a'.(int)$_GET['a'].'a();'); było eval($_GET['a']);

Poświęciłem temu zadaniu pare ładnych godzin, i bardzo chciałbym je zrobic.

0

Zadanie rozwalone ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1