-
이번 문제의 경우 알맞은 id와 pw를 입력하여 FLAG를 획득하는 문제이다.
[문제 해결]
1. 서버 접속

접속 시 ID와 PW를 입력하는 부분을 확인 가능하다.
제출 버튼을 클릭 시 POST 요청을 통해 /check.php 파일이 동작하는 것을 확인 할 수 있다.

코드 확인을 위해 문제 파일을 다운로드 후 분석을 진행한다.
2. 코드 분석
코드를 확인 시 중요 부분은 2가지로 확인된다.

$characters에 저장되어 있는 0~9, a~z, A~Z 문자열을 랜덤 함수를 통해 랜덤하게 총 10자리까지 $randomstring에 저장한다.

위 그림의 빨간 박스를 확인 시 생성된 id 및 pw를 입력된 값과 비교하는 코드를 확인 할 수 있다.
이때 주목해야 할 부분은 입력 받은 id(input_id)와 pw(input_pw)를 int 형으로 변환하여 비교한다는 것이다.
- 문자열을 (int) 로 형변환할 때, 문자열의 맨 앞자리가 문자 형식이라면 출력 결과는 항상 0
-
$a = "v384920"; $b = "kw03mfdv"; $c = "a1293843298523"; print((int)$a); //출력결과 0 print((int)$b); //출력결과 0 print((int)$c); //출력결과 0
-
- 문자열을 (int) 로 형변환할 때, 문자열의 맨 앞자리가 숫자 형식이라면 숫자가 아닌 다른 형식이 오기 전까지의 숫자가 출력
-
$a = "5v384920"; $b = "54321kw03mfdv"; $c = "0101kw03mfdv"; print((int)$a); //출력결과 5 print((int)$b); //출력결과 54321 print((int)$c); //출력결과 101
-
- int 타입과 문자열 비교 연산 시, 문자열을 (int) 로 강제 형변환할 때와 동일한 방식으로 자동 형변환
-
$a = "5v384920"; $b = "54321kw03mfdv"; $c = "0101kw03mfdv"; if ($a == 5) //참 if ($b == 54321) //참 if ($c == 101) //참
-
또한 비교 연산자를 확인 시 값과 데이터 타입 모두를 확인 하는 === 연산자가 아닌 느슨한 비교 ==를 사용하는 것이 확인된다.
이를 이용하여 우회를 진행 할 수 있다.
3. Exploit

id값에는 0 또는 알파벳이 올것으로 상정 후 총 길이를 맞추기 위해 0을 10개 입력, pw의 경우 문자열 "1"을 sha1 해시화 한 값인 356a192b7913b04c54574d18c28d46e6395428ab의 앞 8자리를 입력해준다.

FLAG를 획득하였다.
근데 여기서 이해가 안가는 점은 사실 랜덤으로 생성되는 ID 값에 0보다 큰 숫자, 즉 1 이상의 숫자가 첫번째 자리에 오게 될 시 조건이 맞지 않아 FLAG를 획득 할 수 없다는 것이다.
예 :
- 입력된 ID 값 : 0000000000
- 랜덤 생성된 ID 값 : 12abdfeg09
- 이를 비교시 int(0000000000) != 12(int(12abdfeg09)) 라는 결과가 나온다.
0000000000 말고도 다른 방법이 있을거 같은데 잘 모르겠다. 조금 더 봐야 할거 같다.
'개인공부 > 드림핵' 카테고리의 다른 글
amocafe (0) 2025.02.12 random-test (0) 2025.01.18 baby-union (0) 2025.01.02 BypassIF (0) 2025.01.01 what-is-my-ip (0) 2024.12.31 - 문자열을 (int) 로 형변환할 때, 문자열의 맨 앞자리가 문자 형식이라면 출력 결과는 항상 0