[그림 01] level23 시작
미션은 쿼리에 <script>alert(1);</script>를 넣으라고 하는 것 같습니다.
호호라, 그럼 한 번 저 문장을 입력해 보도록 해야겠습니다.
[그림 02] no hack
미션을 수행했더니 no hack이라고 뜨는군요.
위의 현상은 싱글 문자면 문제가 없지만 두 글자 이상이 쿼리로 전송되면, no hack이라는 답을 뱉어내는 것 같습니다.
예외 : <s 를 붙여서 쓰면 Your mission is to inject <script>alert(1);</script> 라고 나타나게 됩니다. 이것은 단순 오류현상인 것 같습니다.
[그림 03] 띄어쓰기 가능
쿼리문을 날려보았는데 띄어쓰기를 통해 보내보면 [그림 03] 과 같이 결과가 나오게 됩니다.
그러면 어떠한 방식으로 쿼리가 보내지는지 알아보도록 합시다.
주소창을 보니 [그림 04]와 같군요.
[그림 04] GET 방식 쿼리 전송
GET방식으로 URL 인코딩이 되어 올라가는 것을 확인할 수 있었습니다.
그렇다면, 이제 GET방식(URL 인코딩)을 이용하여 쿼리를 보내고, 우회를 해야 하다는 것을 알 수 있습니다.
하지만 %20(SPACE), %0a(NEXT LINE), %09(TAB)은 띄어쓰기 혹은 다음 라인과 같은 효과이기 때문에 인식이 되지 않을 어떤 문자를 넣어주어야 합니다.
그렇다면, 여기서 %00(NULL)을 사용하는 방법으로 우회를 시도해보는 것이 좋을 것 같습니다.
%00 그러니까 NULL은 어차피 PHP에서도 NULL로 해당되기 때문에 결국 붙여쓰는 게 됩니다.
들어올 때는 s NULL c NULL r NULL i NULL p NULL t NULL 이렇게 전송이 되지만, 결국 script가 된다는 의미입니다.
[그림 05] 결과
[그림 05]는 NULL을 첨부하여 문제를 풀이를 시도해본 결과입니다.
어째 결과가 좀 다릅니다. ㅎㅎ;
변화가 일어난 것을 긍정적인 의미로 나머지를 모두 입력해보았습니다.
?code=<%00s%00c%00r%00i%00p%00t%00>%00a%00l%00e%00r%00t%00(%001%00)%00;%00<%00/%00s%00c%00r%00i%00p%00t%00>
위와 같이 쿼리를 GET 방식으로 넘겨보았는데, [그림 05]와 같은 결과가 또 나타났습니다.
어라 이거 아닌가? 하며 뒤로가기를 해보았는데, 문제는 풀려있다는 것을 확인했습니다. 허허...