본문 바로가기
CTF/Dreamhack

[Dreamhack] [wargame.kr] md5 password

by 8희 2023. 11. 1.

https://dreamhack.io/wargame/challenges/337

 

[wargame.kr] md5 password

Description md5('value', true);

dreamhack.io

 

 

VM에 접속해보면 패스워드 입력 란과 소스코드를 볼 수 있는 링크가 있다.

 

 

get source를 클릭하여 확인해봤다.

 

소스코드를 보면 md5() 함수의 두 번째 파라미터에 true 값이 담기는 형태로 md5() 함수가 호출되었다.

md5() 함수에 두 번째 인자 값을 선택적으로 줄 수 있는데, 이가 raw_ouput에 해당하는 옵션으로

이 옵션에서 취약점이 발생한다. 

raw_ouput 옵션의 기본 값은 False이고, true 값이 담기게 되면 raw한 binary 형태로 출력이 되며,

이는 아스키(ASCII) 코드 형태로 처리될 수 있다.

이때 MySQL 조건문의 특징을 이용하여 SQL Injection이 가능하다! 

 

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) 함수가 실행된 결과에서

'='라는 문자열이 포함되면 조건문이 true가 되므로 flag 값을 얻을 수 있다.

 

import hashlib

for password in range(1,111112211) : 
    md5_hash=hashlib.md5(str(password).encode()).hexdigest()

    if '273d27' in md5_hash: 
        print(password)

 

'='가 포함되도록 파이썬 코드를 이렇게 짤 수 있다.

1부터 111112210까지의 숫자를 md5로 해시화 한 후 문자열 취급하여

인코딩 한 값을 16진수로 바꾼 것이다.

 

 

 

코드를 실행하면 여러 값들을 얻을 수 있다. 이 중 어떤 숫자는 되고 어떤 숫자는 안 된다.

맞는 숫자를 입력하면 플래그를 얻을 수 있다. 

 


참고

https://ndb796.tistory.com/332

https://lucete1230-cyberpolice.tistory.com/313

 

'CTF > Dreamhack' 카테고리의 다른 글

[Dreamhack] ROT128  (0) 2023.11.08
[Dreamhack] sql injection bypass WAF Advanced  (0) 2023.11.08
[Dreamhack] simple_sqli_chatgpt  (0) 2023.11.01
[Dreamhack] baby-sqlite  (0) 2023.10.04
[Dreamhack] login-1  (0) 2023.10.04