Iriton's log

[Dreamhack] Beginner: php7cmp4re 본문

WebHacking/WarGame

[Dreamhack] Beginner: php7cmp4re

Iriton 2024. 5. 1. 16:51

서버에 접속해 보면 input1과 input2를 제출하도록 구성되어 있다.

 

아무거나 입력해서 확인해 보니까 check.php로 넘어가면서 Try again 문자열이 뜬다.

이것만 봐서는 뭔지 모르겠으니까 소스코드를 분석해 보자.

 

입력 후 이동한 URL을 보면 check.php 이다. 입력을 처리하는 소스코드가 check.php 파일에 있을 것 같으니

문제 파일에서 check.php를 봐야 한다.

웹 디자인을 위한 코드를 제외하고 본격적으로 살펴봐야 할 소스코드는 위와 같다.

22: require_once 함수는 다른 php 파일의 클래스를 읽어오는 것이다. 따라서 flag.php를 읽어오는 코드이다.

25~28: POST 메서드로 클라이언트가 입력한 값 input1과 input2를 서버로 보낸다.

30번째 줄부터는 그 값을 처리하는 과정이다.

 

36번째 줄을 보면 echo $flag로 flag 값을 출력한다.

따라서 이전의 if 조건문을 모두 통과해야 flag를 얻을 수 있다. 조건문을 살펴 보자.

 

input1의 조건

1. 길이가 4보다 작아야 된다. ->  _ _ _(3글자 이하)

2. "8"보다 작고, "7.A"보다 작으며, "7.9"보다는 커야 한다. 

"8" = 56 10

"7.A" = 55 46 65

"7.9" = 55 46 57

즉, 55 46 57 ~ 55 46 65 사이의 값을 문자열로 표현하면 된다.

55 46을 의미하는 "7."은 문자열에 선행해야 하고

마지막 한 글자만 57을 의미하는 "9"부터 65를 의미하는 "A" 사이의 문자열이면 된다.

 

출처: https://park-duck.tistory.com/entry/%EC%95%84%EC%8A%A4%ED%82%A4%EC%BD%94%EB%93%9C%ED%91%9C-ASCII

 

나는 그 중에서 ":"를 써서 7.:을 input1에 넣도록 할 것이다.

input2의 조건

1. 길이가 3보다 작고 1보다 커야 한다. -> _ _(2글자)

2. 74보다 작으면서 "74"보다 커야 한다.

 

74보다 작으면서 문자열 "74"를 의미하는 55 52보다 어떻게 크지? 생각을 하다가 php 가이드를 봤다.

https://www.php.net/manual/en/language.types.numeric-strings.php

 

PHP: Numeric strings - Manual

 

www.php.net

그냥 한 마디로 php에서는 암묵적인 형변환이 다른 언어에 비해 많이 일어나는 것이다. 

 

문자열이 숫자일 경우, 정수 숫자 문자열이고 int 유형 제한에 맞다면 int형 정수로 변환되고 아니면 float 형이 된다.

-> "74"문자열은 int형 74가 되고 "74.5"는 float형 74.5가 된다.

 

 

문자열에서 숫자가 아닌 문자가 선행되면 그건 TypeError가 발생하고 정수로 취급하지 않는다.(php에서는 문자열보다 숫자가 더 크다는 사람도 있는데 official이 아니라 확실치 않다. 근데 이건 문제 풀이에 중요하지 않으니 패스)

하지만 문자열에서 숫자가 선행하면 문자가 나오기 전까지의 숫자까지를 숫자로 바꿔서 연산을 하게 된다.

예를 들어서 "7AB2"는 7AB2도 아니고, 문자를 뺀 72도 아닌 7로 변환이 되는 것이다.

반면에 "AB72"는 72도 7도 뭣도 아닌 TypeError가 되는 것.

 

이에 따르면 "7(문자)"를 input2에 넣으면 7로 취급이 되어 74보다는 작지만 문자열 "74"보다는 클 수 있게 되는 것이다.

아스키코드표에서 문자열 아무거나 넣으면 된다.

이때 주의할 점은 7 뒤에 숫자를 넣으면 안 된다. 그럼 문자열이 아닌 정수로 변환되어서 조건문에 부합하지 못하기 때문이다.

 

input2값은 7:으로 해 보았다.

flag가 뜬다.

 

input2를 테스트 해보고 싶어서 55 52보다 작은 문자열 7%(55 37)을 넣어봤는데 역시나 플래그를 띄우지 않았고,

%%로만 입력을 해도 플래그를 띄우지 않는다.

 

문제 자체는 쉬운데 php 형변환에 대해 이해하는 게 오래 걸렸던 문제...

Comments