본문 바로가기

SWUFORCE - 워게임

[드림핵 WEB] LEVEL 1 워게임 [wargame.kr] strcmp 문제풀이

 

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

 

 

 

 

주어진 링크에 처음 들어갔을때 

 

 

 

password는 암호화 되어있는 것을 볼 수 있다 

sha1과 md5가 사용됨 

 

 

우선 넘어가고 strcmp 함수 부분을 보자 

($_POST['password'], $password) == 0

 

strcmp 함수는 두 문자열을 비교하는 함수로 첫 번째 문자열과 두 번째 문자열을 비교하여 같으면 0을 반환한다

$_POST['password'] : 사용자가 폼을 통해 입력한 비밀번호

$password : 비교 대상이 되는 서버 측에 저장된 비밀번호

 

 

두 문자열이 같은지 비교하고 같으면 0을 반환 -> 조건문이 true -> if 안에 코드 실행  (플래그 발견) 

이 흐름으로 진행되게 만들어야함 

 

 

근데 이때

php 5.3 버전의 strcmp 함수는 배열과 string을 비교하면 0을 return한다는 취약점이 있다고 함 

또한 NULL과 0을 ==로 비교할 때 True를 반환

 

 

다시 말해서 PHP에서 strcmp() 함수는 strcmp($a,$b) 형식으로 인자를 받는데 이때 비교받을 대상 $a가 문자열이나 숫자가 아니라 배열(array)을 인자로 넣으면 같다고 보고 0으로 실행결과를 돌려주는 취약점이 있다. 

 

 

 

 

따라서 비교 대상인 $password를 배열로 바꿔줘야한다 

name="password[]" 

 

 

 

 

DH{aede9e7fa4ccb8225f12040a16bdfd37c0c5d2f0}

 

 

관리자모드에서 코드를 수정한 후 비밀번호 란에 아무 숫자나 입력했더니 플래그가 나왔다 !


인자가 배열이 되어서 무슨 값을 입력해도 같다고 보고 0을 반환 -> 조건문이 true -> 코드 실행 

 

 

 

php strcmp 취약점에 대해 알아야함