본문 바로가기

웹해킹/wargame.kr

md5 compare

이번에 풀어볼 문제는 md5 compare라는 문제이다.

md5 compare 문제를 들어가면

다음과 같이 뜬다.

start 버튼을 누르면

다음과 같이 뜬다.

view-source를 눌러 소스를 확인하면

다음과 같이 나오는데

소스를 해석해보면

value 1의 값과 value 2의 값이 같아야 해결이 된다.

근데 v1에는 알파벳만 들어가야하고 v2에는 숫자가 들어가야한다.

결론은 알파벳을 넣고 md5 해시 했을 때 값과 숫자를 넣고 md5 해시 했을 떄 값이 동일해야 한다.

당황할 수 밖에 없는 문제였다. 

보안기사 공부할 때 해시 함수를 돌리면 충돌이 발생하지 않고서는 서로 다른 값이 같을 수가 없다고 배워왔길래 내가 배워온 지식을 부정하는 것 같았다.

그래서 혹시나 하는 마음에 구글에 'md5 equal'이라고 쳐보면

stackoverflow에서 친절하게 물어봐주었다.(출처 : https://stackoverflow.com/questions/22140204/why-md5240610708-is-equal-to-md5qnkcdzo)

 

Why md5('240610708') is equal to md5('QNKCDZO')?

var_dump(md5('240610708') == md5('QNKCDZO')); Output: bool(true) Example: http://3v4l.org/2vrMi

stackoverflow.com

페이지를 들어가보면

...더보기

They are both float number format strings (numerical strings), and if you use == in php, when compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically.

Both of the strings are converted to 0 when compared with ==, if you want to compare them as string, remember to use ===(strict comparison) instead.

다음 글을 해석하면

둘다 float 형식의 문자열(숫자 문자열)이며, php에서 '=='을 사용하여 문자열과 숫자 문자열을 비교할 떄 각 문자열을 숫자로 비교한다. 그러므로 '=='로 비교시 두 문자열 모두 0으로 반환이 되기 때문에 문자열로 비교하려면 '==='로 비교해야 한다.

쨌든 php에서 ==으로 비교하면 취약점이 존재하기 때문에 ===으로 하는게 안전하다고 한다.

쨌든 숫자 '240610708'과 문자열 'QNKCDZO'가 md5 해시를 돌릴 때 ''=='' 취약점으로 인해 md5 해시값이 같아진다고 한다.

그러므로

value1 값에 'QNKCDZO' value2에 '240610708'을 집어 넣어 보았다.

집어 넣었더니

flag 값이 출력되었다.

이제 이 flag 값을 문제에 집어 넣고 Auth를 눌러보면

벌써 두 줄이나 풀었다. ㅎㅎ

'웹해킹 > wargame.kr' 카테고리의 다른 글

type confusion  (0) 2019.10.22
tmitter  (0) 2019.08.12
md5 compare  (0) 2019.08.12
strcmp  (0) 2019.08.12
WTF-CODE  (0) 2019.08.12
DB is really good  (0) 2019.08.12