바로 시작하겠습니다.
문제입니다.
제가 php를 잘 몰라서 그냥 뇌피셜로 코드를 해석했습니다.
preg_match()를 구글링 해보니 문자열을 찾는 함수라고 합니다.
즉 preg_match()안에 있는 문자열을 사용하면 No Hack이라고 종료되는 것을 볼 수 있습니다.
그 다음 id와 pw를 입력받습니다.
문제를 어떻게 풀 수 있을지 생각해보니 if($result['id']) solve("gremlin"); 이 if문이 보이더군요.
id의 결과값이 참이면 된다는 것입니다.
id='{$_GET[id]}' and pw='{$_GET[pw]}'"; id의 값을 정해주는 줄을 보니
and 연산자 때문에 입력받는 id와 pw의 값이 모두 참이여야 됩니다.
?id=1&pw=1 일단 이렇게 id와 pw에 아무값이나 넣어줬습니다.
별일 없네요....ㅠㅜ
잠깐 php문법을 설명하자면
php에서 변수를 조정하고 싶으면 ?를 사용하고, 또 다른 변수를 조정하고 싶으면 &를 사용합니다.
왜 안풀리나 생각을 해보면 pw값이 틀렸음을 생각할 수 있습니다.
pw와 id 모두 참이여야 하는데
pw가 참이 아니라 if($result['id']) solve("gremlin"); 이 구문에 걸리지 않습니다.
그럼 pw를 어떻게 참으로 만들 수 있을까요???
우리는 여기서 or연산을 이용할 것입니다.
거짓 or 참은 참이니까요.
다시 쿼리를 짜보면
?id=1&pw=1' or 1=1%23
pw는 1이 아니니 pw=1'은 거짓임을 위에서 확인했습니다.
('가 한쪽에만 붙은 이유는 이미 문제에서 pw에 '를 붙여주기 때문에 '의 짝을 맞춰준 것이다.)
그리고 1=1은 참입니다.
즉 pw=1' or 1=1을 하면 참이 반환된다는 것이다.
뒤에 %23은 #인데 이는 한줄주석입니다.
같은 줄에 있는 #이후의 구문을 모두 무시합니다.
그렇게 짠 쿼리를 보내주면 '의 짝도 다 맞춰주고 pw가 참이되어서 문제가 풀리게 됩니다.
======================================================================
첫 라업입니다.
다음 los라업부터는 문제풀이만 간단하게 할 것 같습니다.
오류나 빠진부분 있으면 알려주세요. 수정하겠습니다.
'Write Up > los' 카테고리의 다른 글
los darkelf[6번] (0) | 2020.01.04 |
---|---|
los wolfman[5번] (0) | 2020.01.04 |
los orc[4번] (0) | 2020.01.01 |
los goblin[3번] (0) | 2019.12.27 |
los cobolt[2번] (0) | 2019.12.27 |