https://dreamhack.io/wargame/challenges/337
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 |