[webhacking.kr] 26번 문제 풀이[PHP]

최대 1 분 소요

💡 Webhacking.kr challenge(old) 26번 문제에 대한 풀이입니다.

문제

문제 화면

image

문제 소스 코드

  <?php
    if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
    $_GET['id'] = urldecode($_GET['id']);
    if($_GET['id'] == "admin"){
      solve(26);
    }
  ?>

문제 풀이

해당 문제는 클라이언트에서 보낸 id를 한번 더 urldecode를 한 다음 해당 값이 admin인 경우 클리어 되는 문제입니다.

우선 기본적으로 클라이언트에서 get이나, post방식으로 데이터를 보내면 urlEncoding이 수행되고, 서버측에서 데이터를 받으면 urlDecoding을 수행합니다. 그리고 그에 따라 기본적으로 서버에서는 무조건 한번의 urlDecoding을 수행한다는 것을 생각하고 문제를 접근하면 됩니다.

우선 id에 다음과 같이 admin의 아스키코드 표현 값인 %61%64%6d%69%6e로 서버로 보내면 위에서 설명했다시피 무조건 한번은 urldecoding을 수행하기 때문에, 첫 번째 preg_match에서는 admin으로 들어가서 no가 출력되게 됩니다.

image image

서버에서 urldecoding이 한번 더 된다는 것을 생각하고 서버에서 한번의 url디코딩을 수행하고 났을 때, %61%64%6d%69%6e가 나오도록 하게 됩니다. 위의 %값을 urlencoding 방식으로 표현하면 %25가 됩니다. 다음과 같이 이를 풀어서 쓰면 됩니다.

%2561%2564%256d%2569%256e

그러면 다음 처럼 두 번에 걸쳐서 디코딩이 수행되면서 preg_match 필터링은 우회하고, 문제를 풀 수 있습니다.

  1. %2561%2564%256d%2569%256e -> %61%64%6d%69%6e
  2. %61%64%6d%69%6e -> admin

image

댓글남기기