안경잡이개발자

728x90
반응형

  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

 

Online editor and compiler

Paiza.IO is online editor and compiler. Java, Ruby, Python, PHP, Perl, Swift, JavaScript... You can use for learning programming, scraping web sites, or writing batch

paiza.io

 

  다음의 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) 값을 찾았습니다.

 

 

 

 

728x90
반응형