Hacking (CTF)/웹 해킹

[Root me] File upload - Double extensions

gapsoo 2023. 9. 30. 14:02

 

https://www.root-me.org/en/Challenges/Web-Server/File-upload-Double-extensions

 

Challenges/Web - Server : File upload - Double extensions [Root Me : Hacking and Information Security learning platform]

 

www.root-me.org


 

 

 

Statement

Your goal is to hack this photo galery by uploading PHP code.Retrieve the validation password in the file .passwd at the root of the application.

=> 목표는 PHP 코드를 업로드하여 이 사진 갤러리를 해킹하는 것입니다. 애플리케이션 루트에 있는 .passwd 파일에서 validation password 를 검색하세요.

 

 

넵! 알겠습니다 ~

 

 

[Start the Challange] 를 눌러 문제 풀이를 시작한다.

 

 

 

 

초기 화면이다.

 

 

 

이모지가 카테고리별로 분류되어있다.

 

 

 

 

업로드 기능도 있다!

 

 

 

내가 좋아하는 사진을 업로드 해봤는데 (참고로 영화 어바웃 타임의 한 장면이다. ㅎㅎ)

 

크기가 너무 크다고 한다. 

 

 

 

 

 

 

난 정보보호학과니까...

 

저 jpg 파일이 사이즈가 작아보여서 선택했는데 업로드됐다.

 

업로드에 성공하면 파일명, 종류, 사이즈, 저장 장소를 알려준다.

 

저장 장소로 가면 내가 올린 이미지 파일을 볼 수 있다.

 

 

 

 

참고로 파일명을 "...jpg" 로 바꿔서 업로드해보았는데,

 

업로드까지는 되는데 저장 장소로 가면 403 Forbidden 이 뜬다.

 

 

 

 

아까 Statement 를 떠올려보면

 

 

라고 했는데, 여기서 궁금한 것 두 가지

 

Q1) "NB : only .gif, .jpeg and .png are accepted" 라는데 어떻게 php 파일을 올리지?

 

Q2) 애플리케이션 루트에 있는 .passwd 파일은 어떻게 접근해야할까?

 

 

 

 

 

여러가지 생각해보다가 이 문제의 제목에서라도 힌트를 얻을 수 있을까 하여 다시 떠올려봤는데 double extension (이중 확장자) 이었다.

 

그래서 올릴 수 있는 확장자는 .gif, .jpeg, .png로 제한되어 있지만,

 

파일명에 "php"와 같은 다른 확장자명을 포함하여 업로드하면 활용할 수 있지 않을까? 하는 생각이 들었다.

 

 

 

 

 

 

 

 

txt 파일의 이름에 .php를 넣고 확장자는 임의로 jpg 로 바꾸어서 업로드해보았는데

 

업로드 할 수 있을 뿐만 아니라

 

 

 

텍스트도 읽을 수 있었다!

 

 

 

 

 

이전에 웹셸을 활용하여 문제를 풀어보려 했더니 '<' 문자가 받아들여지지 않았던 것이 생각나서

 

'<>'가 인식이 되는지 궁금해 저렇게 내용을 바꿔보았다.

 

 

 

오 < > 모두 인식이 된다.

 

그러니까, 누락된 글자 없이 <body>~</body> 사이의 소스 코드에 반영이 된다.

 

php파일 + <> 모두 인식 가능함 => 웹셸을 활용해 풀 수 있지 않을까? 라는 생각이 들었다.

 

 

 

 

 

(그냥 여기서부턴 적용이 되는지 테스트 해본 내용....)

 

 

 

 

파일 업로드 페이지의 소스코드를 복사해서 테스트해보도록 한다.

 

 

 

 

 

업로드는 성공했고

 

파일이 저장된 경로로 들어가주면,

 

 

 

이렇게 내가 복사한 코드가 그대로 반영이 되었다.

 

 

 

 

"php 코드를 통해 애플리케이션 루트에 있는 .passwd 파일에서 validation password 를 검색" 하라고 했으니

 

업로드할 파일 안에 어떤 코드를 넣어서 .passwd 파일로 이동할 수 있도록 하자.

 

 

 

그런데 php 코드에 대해 잘 몰라서 페이지 이동과 관련된 php 코드를 찾아보았다.

 

(참고: https://tw-news.tistory.com/15)

 

[PHP] 페이지 이동 방법

PHP에서 페이지 전환을 하고 싶을 때 사용할 수 있는 4가지 방법 1. 자바스크립트 Location.href 이용 echo ""; 2. 자바스크립트 Location.replace 이용echo ""; 3. Header 이용header("location: URL 또는 경로"); 4. 메타

tw-news.tistory.com

 

 

 

 

이런 내용을 작성해서 파일을 만들어주고 업로드한 뒤 

 

 

 

 

파일이 저장된 주소 링크를 눌러주면

 

 

 

 

http://challenge01.root-me.org/web-serveur/ch20/galerie/upload/.passwd 로 이동은 할 수 있었으나 

 

여전히 접근이 금지된 것을 확인할 수 있었다.

 

 

 

 

 

더 이상 아이디어가 떠오르지 않아서 여기서부터 구글링을 통해 문제 풀이를 진행했다.

 

 

 


 

⭐  지금까지의 상황 정리 ⭐

 

 

위에서 했던 고민

 

 

스스로 문제를 풀어보면서 이렇게 두 가지 고민을 했었는데

 

첫 번째 의문점은 해결을 했었다. 

 

문제의 제목인 '이중 확장자'에서 힌트를 얻어와서 ".php.jpg" 처럼 확장자를 두 번 사용하는 파일 이름을 입력해서 php 파일을 업로드 할 수 있었다.

 

 

이제 두 번째 의문점을 해결하기 위해 구글링을 해야 하는 상황이다.

 

 

 


먼저, 이 문제와 관련된 개념을 알아보겠다.

(.passwd 파일의 경로를 알아내는 방법이 궁금하면 더 밑으로 스크롤하면 됩니다!)

 

 

 

[1] 파일 업로드 취약점

 

 

게시판 등에서 스크립트(소프트웨어에 실행시키는 처리 절차를 문자(텍스트)로 기술한 것. 일종의 프로그램이라고 할 수 있다.) 파일의 업로드에 대한 규제가 없을 경우 이를 악용한 해커에 의해 악성 스크립트 파일이 수행될 수 있는 보안 취악점. 첨부 파일 업로드를 허용하는 홈 페이지 게시판에서 .php, .jsp 등의 확장자 이름의 스크립트 파일의 업로드를 허용할 경우에 해커가 악성 실행 프로그램을 업로드한 후에 홈 페이지 접속 방식으로 원격에서 서버컴퓨터의 시스템 운영 명령어를 실행시킬 수 있다. 예를 들어 모든 게시판에 대해 php, php3, asp, jsp, cgi, inc, pl 등의 확장자를 지닌 파일의 업로드를 시도하여 업로드가 되면 취약점이 있는 것이다.


[네이버 지식백과] 파일 업로드 취약점 [File Upload Vulnerability, -脆弱點] (IT용어사전, 한국정보통신기술협회)

 

 

 

 

 

[2] 웹 셸

 

 

 

웹 셸(web shell)은 업로드 취약점을 통하여 시스템에 명령을 내릴 수 있는 코드를 말한다. web shell은 간단한 서버 스크립트 (jsp, php, asp...)로 만드는 방법이 널리 사용되며 이 스크립트들은 웹 서버의 취약점을 통해 업로드된다. 웹셸 설치 시 해커들은 보안 시스템을 피하여 별도의 인증 없이 시스템에 쉽게 접속 가능하다.

(웹이 서버에서 구동되고 있다 하여도 취약점이 존재하지 않으면 수행되지 않으며, 만약 업로드되었다 하더라도 실행 권한이 없으면, 실행이 되지 않는다. 하지만 취약점과 실행 권한이 존재할 때는 서버 내부에 명령을 수행할 수 있으므로 침해 범위가 넓어질 수 있다.)

사용자로부터 입력된 시스템 명령어를 셸에 전달하는 기능을 가지고 있다.

 

 

출처: 위키백과 - 웹 셸

 

 

 

 

+ [3] Web Shell 업로드 방지 (보안)

 

 

 

1.업로드: 파일 업로드가 불필요할 경우 업로드 기능을 완전히 제거하고 업로드가 필요한 경우 확장자를 제한한다. 확장자를 제한할 시에는 특정 확장자를 막는 것보다 특정 확장자만 되게 하는 것이 더 안전하다. 또한 txt.php 같은 유형의 이중 확장자 검사도 해야 한다.

2.파일 업로드 폴더 실행 제한: 웹 서버 업로드 전용 폴더를 만들고 파일의 실행을 제한한다.

 

 

출처: 위키백과 - 웹 셸

 

 

 

정리

 

 

.asp, .php, .jsp와 같은 확장자들은 서버 측에서 실행되는 프로그래밍 언어로 작성된 파일들이다. 이러한 파일들이 서버에 업로드되면, 해당 파일이 서버에서 실행될 수 있다. 이는 보안상의 문제를 초래할 수 있다.

예를 들어, 악의적인 사용자가 이러한 확장자로 작성된 파일을 업로드한다면, 해당 파일은 서버에서 실행될 수 있게 되어 웹 셸(web shell)의 역할을 할 수 있다. 웹 셸은 웹 어플리케이션을 통해 서버에 명령을 전송하고 실행하는 도구로서, 이를 악용하면 서버를 제어하거나 중요한 정보를 탈취할 수 있다.

따라서 보안을 위해 대부분의 웹 서버에서는 이러한 확장자들을 업로드하거나 실행하지 못하도록 막아놓는다. 이렇게 함으로써 악의적인 코드가 서버에 업로드되어 실행되는 것을 방지하고, 보안을 강화할 수 있다.

 

 

 

 


.passwd 파일의 내용을 출력하는 방법

 

 

웹 어플리케이션에서 사용자로부터 입력을 받아 시스템 명령을 실행하는 기능을 가진 코드가 작성된 PHP 파일을 업로드 하면 된다.

 

먼저 다음과 같은 코드를 작성한 php.jpg 파일을 업로드 했다. 

 

 

<?php
    system($_GET[cmd]);
?>

 

 

 

이 코드를 해석하자면

 

1. <?php: PHP 코드의 시작을 나타냅니다. 이 표시는 PHP 코드 블록의 시작을 알립니다.
2. system($_GET['cmd']);: 이 부분은 시스템 명령을 실행하는 역할을 합니다. $_GET['cmd']는 GET 요청을 통해 전달된 'cmd' 매개변수의 값을 가져오는 것을 의미합니다. 사용자가 URL을 통해 'cmd' 매개변수를 전달하면, 이 값은 system() 함수의 매개변수로 전달됩니다.

출처: 챗 GPT

 

 

 

이 코드의 역할은

 

사용자로부터 GET 메소드로 'cmd'라는 변수를 전달받아 이를 시스템 명령어로 실행한 후 결과를 출력하는 것이다.

 

사용자가 웹 어플리케이션을 통해 'cmd' 변수에 어떤 명령어를 전달하면, 이 코드는 해당 명령어를 실행하고 결과를 화면에 출력한다.

 

 

 

 

 

이제 파일을 업로드해보자.

 

 

 

 

오류 메시지를 살펴보면 두 가지 문제가 있다.

 

 

1. Use of undefined constant cmd - assumed 'cmd': 'cmd'라는 상수를 사용할 때, PHP는 이를 문자열로 처리한다. 하지만 'cmd'를 따옴표로 감싸지 않았기 때문에 PHP는 이를 상수로 인식하려고 시도했으며, 그 결과로 경고가 발생했다.

2. Cannot execute a blank command: system() 함수에 빈 명령을 전달하려고 했기 때문에 발생한 오류이다. ($_GET['cmd']에서 'cmd' 변수를 전달하지 않아서 발생한 것으로 보인다.)

 

 

 

다시 수정해서 파일을 업로드해보자.

 

<?php
    $cmd = $_GET['cmd'];
    system($cmd);
?>

 

 

 

 

 

 

이 오류에 대해 알아보았다.

 

 

오류 메시지인 "Cannot execute a blank command"는 시스템 명령어가 비어있어서 실행할 수 없다는 것을 나타냅니다. 즉, 'cmd' 변수에 어떠한 값도 전달되지 않았거나 빈 문자열이 전달되었다는 것입니다.

이 문제를 해결하려면 'cmd' 변수에 유효한 시스템 명령을 전달해야 합니다. 예를 들어, ?cmd=ls와 같이 URL에 'cmd' 변수를 포함시키면 서버는 "ls" 명령어를 실행할 것입니다.

출처: 챗 GPT

 

 

그렇다고 한다.

 

 

URL 맨 끝에 ?cmd=id 라고 입력해서 cmd 변수에 id 라는 값을 담아주면 system('id') 가 서버로 전달되어 id 명령어가 실행될 것이다.

id 명령어가 실행된 결과

 

 

 

 

 

이제 문제에서 원하는 바와 같이 .passwd로 접근해보자.

 

?cmd=cat /challenge/web-serveur/ch20/.passwd입력해주자.

 

(시스템에서 /challenge/web-serveur/ch20/.passwd 파일의 내용을 출력한다.)

 

 

 

 

 

 

.passwd 파일의 내용을 확인할 수 있었다.

 

 

 

정답!

 

.passwd 파일의 내용을 복사하여 답으로 입력하면 된다.

'Hacking (CTF) > 웹 해킹' 카테고리의 다른 글

[Dreamhack/드림핵] image-storage  (1) 2023.09.30
[Root me] Install files  (0) 2023.09.30
[Webhacking.kr] old-28  (0) 2023.09.28
[webhacking.kr] old-12번  (0) 2023.09.27
[Root Me] Javascript - Webpack  (0) 2023.09.26