[해킹 대회 문제] wargame.kr - md5 password 문제풀이(Write Up)
md5 password 문제는 PHP에서 md5() 함수를 이용할 때의 주의사항에 대해서 알고 있는지 물어보는 문제입니다.
문제 풀이 페이지에 접속하면 곧 바로 [get source] 버튼을 눌러 PHP 소스코드를 확인할 수 있습니다.
본 문제는 md5() 함수가 취약하게 사용될 때에 대해서 물어보는 문제입니다. 이미 잘 알려진 취약점으로 md5({변수}, true)의 형태로 사용하게 될 때의 소스코드 오용에 대하여 물어보는 것입니다.
아래 소스코드를 보시면 md5() 함수의 두 번째 파라미터에 true 값이 담기는 형태로 md5() 함수가 호출되었습니다. 두 번째 파라미터에 true 값이 담기게 되면 raw한 형태로 출력이 이루어집니다. 다시 말해 raw한 binary 형태로 출력이 되며, 이는 아스키(ASCII) 코드 형태로 처리될 수 있습니다. 이 때 MySQL 조건문의 특징을 이용하여 SQL Injection이 가능합니다.
▶ MySQL 온라인 컴파일러: https://paiza.io/en/projects/new?language=mysql
다음의 MySQL 코드를 실습해보세요.
create table Test(id integer, password varchar(100));
insert into Test(id, password) values(1, "123123");
select * from Test where password = '' = '';
MySQL에서는 데이터를 검색할 때 위와 같은 형태로 조건문을 작성하면 WHERE 조건절이 항상 참(True) 값을 가지게 되어 무조건 데이터를 조회하게 된다는 특징이 있습니다. 다시 말해 아래 소스코드에서 md5({사용자가 입력한 값}, true) 함수가 실행된 결과에서 '='라는 문자열이 포함된다면 조건문은 참 값을 가지게 되어 문제가 풀릴 수 있습니다.
이 문제의 답은 직접 파이썬(Python) 소스코드를 작성하여 도출할 수 있습니다.
파이썬(Python)에서의 md5() 함수는 바이트 형태의 데이터를 받아서 해시(Hash)화를 수행합니다. 그러한 해시 값에서 digest() 함수를 수행하면 해시 값이 바이트 데이터로 변환되어 출력됩니다.
따라서 무작위 숫자를 대상으로 하여 해시 값을 만들어 낸 뒤에, 해당 해시 값에 '='의 바이트 값이 포함되어 있다면 이것을 정답으로 제시하여 플래그(Flag)를 얻을 수 있다는 의미입니다.
import hashlib
for i in range(0, 1000000):
if b"'='" in hashlib.md5(str(i).encode()).digest():
print('Found: {0}'.format(i))
위 소스코드는 파이썬(Python) 개발환경이 없는 분들도 온라인 파이썬 컴파일러를 이용하여 실행하실 수 있습니다.
▶ 파이썬(Python) 온라인 컴파일러: https://www.onlinegdb.com/online_python_compiler
따라서 얻어 낸 값 중에서 7201387을 골라서 넣어보겠습니다.
플래그(Flag) 값을 찾았습니다.
'해킹 방어 대회(CTF)' 카테고리의 다른 글
[해킹 대회 문제] wargame.kr - strcmp 문제풀이(Write Up) (0) | 2019.07.13 |
---|---|
[해킹 대회 문제] wargame.kr - DB is really GOOD 문제풀이(Write Up) (0) | 2019.07.13 |
[해킹 대회 문제] wargame.kr - fly me to the moon 문제풀이(Write Up) (0) | 2019.07.13 |
[해킹 대회 문제] wargame.kr - WTF_CODE 문제풀이(Write Up) (0) | 2019.07.13 |
[해킹 대회 문제] wargame.kr - login filtering 문제풀이(Write Up) (1) | 2019.07.13 |