1. 코드 분석

 

-generatePassword라는 함수는 “0123456789abcdef” 사이의 문자에서 지정된 길이의 문자열을 생성하게 됩니다.

 

 

-generateOTP라는 함수는 0~999999 사이의 랜덤한 정수를 생성합니다.

-strval를 통해서 만약 123을 생성 했다면 “123”이라는 문자열이 됩니다.

-str_pad에서는 만약 생성된 문자열이 6보다 짧을 시 0을 추가하게 됩니다.

-str_pad 에서 STR_PAD_LEFT라는 옵션을 주었기에 왼쪽에 0이 추가가 됩니다.

 

 

-cred base64로 인코딩이 되어있습니다.

-cred base64를 디코드하고 json으로 디코드하여 확인합니다.

-cred id, pw, otp가 다 있어야 합니다.

-cred admin이 아닐 시 hello 출력하고 login()가 종료하게 됩니다.

-cred에 입력한 otp와 생성한 otp가 같은지 확인합니다.

-cred pw admin_pw와 같은지 확인하고 같으면 flag를 출력합니다.

 

 

우리는 생성된 otp 값을 유추하지 않고 위 코드를 우회할 수 있는 방법이 있습니다.

 

-otp를 입력값과 생성된 값을 비교하기 위해서 비교 연산이 수행이 되는데 이때 형변환이 진행이 됩니다.

-저희는 생성된 otp 값이 p로 시작하는 문자열이라는 것을 알 수가 있습니다.

-p로 시작하는 문자열을 정수형으로 변환이 되었을 때 php 쪽에서는 문자열이 숫자와 전혀 관련이 없거나 숫자처럼 해석할 수 없기에 0이 반환되게 됩니다.

 

 

간단하게 검증을 한 번 해 봤습니다.

 

 

pw도 값을 유추하지 않고 우회를 할 수 있습니다.

 

-strcmp에는 한 가지 특징이 있습니다. 문자열 이외에 다른 타입을 입력되었을 시 의도치 않은 동작을 일으킬 수 있습니다.

-배열이 입력되었을 시 strcmp NULL을 반환하게 됩니다.

 

2. Exploit

 

 

위에서 소스 코드 분석한 것을 순차적으로 대입해서 코드를 만들었습니다. 이것을 실행을 시키면 flag 값을 얻을 수가 있습니다.

'[Dreamhack]wargame > WEB' 카테고리의 다른 글

[Dreamhack] EZ_command_injection 문제  (0) 2024.09.13
[Dreamhack] node-serialize 문제  (0) 2024.09.10
[Dreamhack] baby-Case 문제  (0) 2024.09.03
[Dreamhack] [wargame.kr] jff3_magic 문제  (0) 2024.09.03
[Dreamhack] Filestorage 문제  (0) 2024.05.13

+ Recent posts