Type c-j


소스코드 분석

check.php

플래그를 출력하기 위해서는 check.php 파일을 분석해야 합니다.

  • (1) 35, 36라인 : $id 변수에 10글자로 구성된 문자열, $pw 변수에는 sha(1) 결과 저장
    • sha1 함수는 16진수로 구성된 40글자 해시 값을 반환
  • (2) 38번 라인 : POST 요청으로 input1, input2 값 받기
  • (3) 43번 라인 : (int) $input_id == $id 느슨한 비교 수행

  • 1번째로, PHP에서는 문자열의 형변환이 이뤄지는 경우에 아래와 같이 동작합니다.
      1. “abcdefg12345” : 0
      1. “12345abcdefg” : 12345
      • (맨 앞 값을 기준으로, 숫자로 변환 가능하면 숫자로, 불가능하면 0 반환)
  • 2번째로, 느슨한 비교는 아래와 같은 결과를 반환합니다.

  • (1) $id 값은 getRandStr(...) 함수에 의해 만들어지고 항상 10글자로 구성된 임의의 문자열입니다.
  • (2) (int) $input_id == $id 조건에서 우리가 컨트롤 할 수 있는 값은 $input_id 부분입니다.
  • 우리는 위 표에서 0 == "php" 결과가 참(TRUE)인 것을 확인했습니다.
    • 따라서, $input_id 값이 0이 되도록 하면 됩니다.

  • 이렇게 말이죠?
  • $input_id로 입력받은 값의 길이가 10인지 확인하는 조건문도 있었기 때문에
  • 임의의 문자열로 10글자를 채워줬습니다.
    • 모두 가능 (abcdefghij / 0bcdefghij / 0000000000)

  • 이제 패스워드 검증 로직을 통과해야 합니다.
  • 패스워드로 입력받은 값과 sha(1) 값이 동일한지 확인하는 로직이네요.
    • 여기에서도 동일하게 (int) 정수형으로 형변환이 이뤄지고 있습니다.

  • sha(1) 함수의 리턴 값은 356a192b7913b04c54574d18c28d46e6395428ab 입니다.
  • (int) 356a192...428ab는 356 으로 값이 변환됩니다.
    • 따라서, $input_pw 값으로 “356abcdefg” 을 넣어주면 통과되겠죠?

  • Wkwks. 플래그 획득에 성공했슴다.

🐛.. 🐛.. 🐛..


REFERENCE

  1. https://www.php.net/manual/en/function.sha1.php
  2. https://hyunmini.tistory.com/90