ez 로그인 도전
ID, PW, OTP를 입력해서 로그인하면 된다.
뭐 아무거나 쳐보자.
오호
코드를 다운받았다. php 코드로 되어있다.
PW는 0~f 까지의 길이 -1만큼의 16진수 문자로 되어있다.
OTP는 P로 시작하는 6자리 랜덤 정수?이고 빈 칸은 0으로 채우는 것 같다.
벌써 어려운 냄새 솔솔 풍긴다.
일단 중요해보이는 부분은 base64 인코딩 된 걸 디코딩하는 것.
json도 인코딩? 디코딩?
id가 admin이라는 것.
strcmp로 cred['pw'] 와 GLOBALS['admin_pw']를 비교하는 것.
cred가 아마 내가 입력해야 할 부분? 인 듯 하고 GLOBALS는 전역변수 같은데 생성된 비밀번호를 말하는 것 같다.
아무튼 위의 if문 관문을 뚫고 비밀번호가 맞으면 flag를 출력한다.
이거 영어 공부를 해야하나... 코딩 공부를 해야하나..............
어려움이 있어서 또 검색 찬스.................
패스워드와 OTP를 우회해야 한다는데..!
https://www.php.net/manual/en/types.comparisons.php
여기 PHP 홈페이지 메뉴얼에서 보고 할 수 있다는데..!
PHP에서는 문자열을 비교할 때 자동으로 타입이 변환된다는데..!
일단 OTP는 != 이걸로 비교하고 있고, PW는 strcmp 함수로 비교하고 있다.
==가 붙은 걸 보니 !=는 이걸로 하는 것 같다.
두 개를 비교해서 true인지 false인지 판단하고,
만약 타입이 다르면 자동으로 변환된다.
OTP 생성 코드에서 strval 함수로 OTP를 문자열로 변환하기 때문에
나는 입력값을 문자열 말고 다른걸로 줘서 true가 나오게 하면 될 것이다.
true를 주면 되겠지?
이제 PW.
strcmp 함수는 인자값으로 string이 들어오지 않으면 null(false)를 반환하는 취약점이 있다고 한다.
그래서 [ ]을 주면 null이랑 만나서 true값을 반환할 것이다.
입력해본다.
아..... 뭥미 ㅡㅡ?
서버 다시 열어서 했는데 OTP fail 뭐지 하며 다시 검색 찬스....
아.... 여기서 하는 게 아니고 익스플로잇으로 코드 짜서 flag만 알아내는구나...
낭만 없네 ㅡㅡ
ㅋㅋ 혼자 할 수 없는 구조
파이썬은 있는데
requests 모듈이 없다고 계속 실행이 안 돼서
cmd창에서
> pip install requests
를 입력하여 설치 완료.
아 ~~ 속이 다 시원하다 그냥
DH{85256d8e59d3603651c9053572506e088d8a953e0faa59f769afd1745b09a618} 플래그 겁나 기네 찍어서 풀지도 못하겠네 그냥 후..
제출할게요
다시는 이런 문제 ez 하다고 속이지 마쇼.