문제 설명을 보면 비교를 하는데 다른 값으로 해야 한다는 것 같다. 

문제 페이지를 보면 두 개의 값을 입력받는다. 

소스 코드를 확인해 보면 v1과 v2의  md5 값이 같으면 문제를 해결할 수 있는데

ctype_alpha() 함수로 v1이 알파벳인지 검사하고, is_numeric() 함수로 v2가 숫자인지 검사한다.

php md5 비교에서 두 md5 해시값의 앞부분이 0e로 같은 값을 가지면 참을 반환하는 취약점이 있다.

이러한 값을 가지는 알파벳과 숫자는 QQNKCDZO 와 240610708 가 있다.

이러한 취약점을 막기 위해서는 === 연산자를 사용하는 방법이 있다.

알파벳 값을 v1(첫번째)에 넣고 숫자 값을 v2(두번째)에 넣으면 flag를 얻을 수 있다.

 

알게된 점 : php md5함수에서 비교 취약점과 보안방안, php ctype_alpha()함수, is_numeric() 함수

'Security & Hacking > Wargame' 카테고리의 다른 글

[Wargame.kr] type confusion  (0) 2019.09.10
[Wargame.kr] tmitter  (0) 2019.09.07
[Wargame.kr] strcmp  (0) 2019.09.02
[Wargame.kr] DB is really GOOD  (0) 2019.09.02
[Wargame.kr] md5 password  (0) 2019.08.29

문제 설명을 보면 md5 함수가 나와 있다.

 

문제 페이지를 보면 password를 입력하는 입력란이 있고, 페이지 소스 코드를 볼 수 있다.

 

소스 코드를 보면 md5 함수에서 취약점이 발생한다.

md5  함수 옵션의 기본값은 false 인데, true 옵션을 사용하게 되면 해시 값을 바이너리 형식으로 반환하게 된다.

 

또한 sql에서 패스워드의 값이 '=' 의 형태로 들어가게 되면 참 으로 인식하고, php내에서는 md5 해시한 값이 바이너리 형식으로 인식하기 때문에 어떤 값을 md5 해시한 결과가 '=' 인 값을 찾아야 한다.

파이썬으로 코딩해서 찾아보면 1839431 이라는 값을 찾을 수 있다.

 

import hashlib

 

for i in range(0,1000000000):

    if b"'='" in hashlib.md5(str(i).encode()).digest():     # bytes형태로 바꿈

        print('Found: {}'.format(i))

 

찾은 값을 문제 페이지의 password 값을 입력하면 flag를 얻을 수 있다.

 

알게된 점 : php에서 md5함수의 옵션이 true로 설정되게 되면 취약점이 발생한다.

md5함수의 기본값 옵션은 false 이다. 

'Security & Hacking > Wargame' 카테고리의 다른 글

[Wargame.kr] strcmp  (0) 2019.09.02
[Wargame.kr] DB is really GOOD  (0) 2019.09.02
[Wargame.kr] fly me to the moon  (0) 2019.08.27
[Wargame.kr] WTF_CODE  (0) 2019.08.27
[Wargame.kr] login filtering  (0) 2019.08.25

+ Recent posts