본문 바로가기
Hacking/wargame.kr

[wargame.kr] Question 7. strcmp

by 알거음슴 2021. 6. 24.

문제

if you can bypass the strcmp function, you get the flag.

Strcmp 기능을 우회할 수 있다면 Flag를 찾을 수 있다.

 

 

풀이

문제 접근 시 password 입력 폼 및 source를 볼 수 있는 하이퍼링크가 확인된다. 우선 문제에서 제시된 strcmp 기능의 대해서 알아보자.

 

[참조] strcmp() 함수

strcmp( string1, string2 ) 형식, php에서 사용되는 함수로 string1string2 을 비교한다 해당 인자는 문자열 형식이고 대소문자를 구분한다 문자열 대신 변수를 값으로 넣을 수 도 있다.

비교 결과는 다음과 같다

 1) string1 > string2 : 음수값을 반환 (0보다 작은값)

 2) string1 < string2 : 양수값을 반환 (0 보다 큰값)

 3) string1 = string2 : 0 을 반환

 

view-source 소스코드 확인 시 strcmp($_POST['password'], $password) == 0있다. 문제에서 제시된 strcmp() 함수 구문이고 POST_Method 방식으로 입력 받은 변수값과 $password 변수값을 비교하여 값이 0일경우 Flag값을 출력하는걸 확인할 수 있다.

 

php 5.3이상 버전에는 두가지 특이점이 있다.

 1) strcmp() 함수의 비교 인자가 배열과 문자열일 경우 Null을 출력한다.

 2) Null == 0 을 비교 할 경우 True가 출력된다.

_POST 변수의 내용을 배열로 입력하여 Null값으로 만든 후 Null == 0 을 비교하여 True값의 결과를 출력받을 수 있다.

 

개발자 도구(F12) -> Elements 탭을 통하여 input 함수의 name=”password[]” 수정하여 입력 을 배열로 변경시킨 후 임의의 문자를 입력 시 Null 값이 Post로 전송 되며 이에 True값으로 정답 페이지에 접속할 수 있다.

 

Flag : 789b3066f63b82fcf29dbab6e199df62366e9443

성공적으로 Flag 값을 획득하고 초기 화면에 해당 Flag 값을 제출하면 통과할 수 있다.   

strcmp() 의 취약점을 이용한 문제이나 비교연산자를 === 으로 사용할 경우 정확한 값의 비교를 요구하게 되기 때문에 문제 같은 상황을 막을 수 있다.