안녕하세요.
워 게임 md5 password 문제 풀이 하겠습니다.
해당 문제의 소스코드를 보면,
admin_password 테이블의 password 값에 md5 해시 값을 row 변수에 저장한다.
isset($row[0])가 true일 경우 Password 값을 출력해주고 있습니다.
이 문제는 md5의 취약점을 알고 문제의 적용할 수 있는지를 묻고 있습니다.
md5 함수는 인자로 들어온 문자열을 md5 해시하여 32bytes 길이로 반환합니다.
두 번째 인자는 이는 raw_output에 해당하는 옵션입니다.
raw_output 옵션의 default는 False 이며 Hex값을 출력하고,
True로 주게된다면 32bytes 길이의 Hex 값을 16bytes의 바이너리 값으로 반환해줍니다.
raw_output가 true인 경우, 결과 값이 binary값으로 출력되어 SQL 구문을 조작하여 SQL Injection 공격을 시도할 수 있습니다.
즉, md5($ps, true)를 '='로 만들어주면 SQL에서 password 값이 '='가 되면 참으로 인식하여 구문이 참이되게 됩니다.
Python을 사용하여 임의의 값을 md5 해시한 값이 '='를 찾아보면,
Python에서의 md5() 함수는 바이트 형태의 데이터를 받아서 해시를 수행합니다. 그러한 해시 값에서 digest() 함수를 수행하면 해시 값이 바이트 데이터로 변환되어 출력됩니다.
import hashlib
for i in range(0, 1000000000):
if b"'='" in hashlib.md5(str(i).encode()).digest(): # bytes형태로 바꿈
print('Found: {}'.format(i))
결과로 출력된 하나의 값을 제출하면 문제를 해결할 수 있습니다.
감사합니다.
'Hacking > Wargame.kr' 카테고리의 다른 글
[Wargame] strcmp (0) | 2021.03.21 |
---|---|
[Wargame] fly me to the moon (0) | 2021.03.17 |
[Wargame] WTF_CODE (0) | 2021.03.06 |
[Wargame] login filtering (0) | 2021.03.01 |
[Wargame] QR CODE PUZZLE (0) | 2021.02.25 |