[Webhacking.kr] old-28
https://webhacking.kr/chall.php
Webhacking.kr
webhacking.kr
old-28 문제를 누르면 가장 처음으로 나오는 화면이다.
미션은 ./upload/gKlIl1weasuc/flag.php 파일을 읽는 것이고
내 파일은 ./upload/gKlIl1weasuc/ 에 업로드 된다고 한다.
./upload/gKlIl1weasuc/flag.php 을 누르면
아무것도 나오지 않는다~
일단 [파일 선택] 버튼을 눌러서 아무 사진이나 올려봤다.
"file too big"이라는 문구가 생겼고,
http://webhacking.kr:10002/index.php --> 초기화면 웹페이지 주소뒤에 /index.php 가 추가됐다.
방금 올렸던 이미지 파일이 너무 크다길래, 파일 크기가 작을 것 같은 텍스트 파일을 만들어서 올려봤다.
이번에는 제출이 되어서 파일이 업로드 되었다고 한다.
업로드 된 안녕하세요.txt 파일로 들어가보았는데,
원래대로라면 "안녕하세요" 라고 적혀있어야 하는데 문자가 깨진 것을 확인할 수 있었다.
그런데 action="index.php" 부분이 정확히 무슨 뜻인지 모르겠는데 신경이 쓰였다.
방금 전에 만든 안녕하세요.txt 파일을 내가 임의로 flag.php로 바꾼 다음
제출했더니 "no" 라고 뜬다.
그래서 개발자 도구에서 소스코드를 살펴보면 flag.php 파일을 올리지 못하도록 설정되어 있을 것이라고 예측했다.
그러나 소스코드를 확인해봤더니 예측과 관련된 정보는 없었고, 다른 것도 알아낼 수 있는 것이 없었다.
action="index.php" 부분이 신경이 쓰여서
안녕하세요.txt 파일을 index.php 파일로 이름과 확장자를 임의로 바꾸어서 제출해보기로 했다.
안녕하세요.txt 파일을 index.php 파일로 이름과 확장자를 바꾸어서 올렸더니
파일 안의 내용을 읽을 수 있었다.
action="index.php" 부분때문에 index.php 파일만 내용을 읽어들일 수 있는 게 아닐까? 하는 생각이 들었다.
그리고 index.php 파일의 내용이 <body>~</body> 사이에 들어가는 것을 확인할 수 있었다.
index.php 파일의 text에 어떠한 정보를 넣으면 <body>~</body> 사이에 들어간다는 사실을 활용해서
무언가 할 수 있지 않을까 싶었다.
그래서 index.php 파일 안에 의미 있는 소스 코드를 넣어보면
<body>~</body> 안에 그대로 들어갈 것 같아서 해봤는데,
< 가 인식이 안 된다.
내가 푸는 방향이 이상해지는 것 같아서 여기서부터 구글링을 했다~

이 문제가 나에게는 굉장히 어렵다고 느껴졌는데,
사실 php가 뭔지, 어떤 특징을 가지고 있는지부터 잘 몰라서
차근차근 알아보았다.
[1] PHP 란?
(참고: https://choseongho93.tistory.com/61)
우선 PHP의 개념과 특성을 알아보도록 하자.
PHP는 주로 서버 측에서 실행되는 스크립트 언어이다. 이는 웹 서버에서 PHP 코드가 실행되어 그 결과물이 HTML로 변환되어 클라이언트(웹 브라우저)에게 전송된다는 것을 의미한다. 이렇게 전달된 HTML 코드에는 PHP 프로그램 코드가 직접 들어있지 않다. 대신에 PHP 코드는 서버에서 실행되어 그 결과물이 HTML에 포함되어 전송된다.
또한, PHP는 데이터베이스와의 연동이 용이하며, 주로 MySQL과 함께 사용되어 다양한 웹 애플리케이션을 개발하는 데 많이 활용된다. 블로그, 소셜 네트워크 서비스, 쇼핑몰, 일정 관리 시스템 등을 만드는 데에 많이 사용된다.
PHP의 특징 중에서도, 이번 문제를 풀기 위해 주목해야 하는 점은
'PHP는 서버 측 스크립트 언어이므로 웹 서버에서 실행되고, 이는 클라이언트(웹 브라우저)에게 전송되기 전에 서버에서 처리되기 때문에 보안 측면에서 유리하다.' 는 사실이다.
다시 문제로 돌아와보면,
./upload/gKlIl1weasuc/flag.php 에 들어갔을 때,
아무것도 안 뜨는 이유는 아까 위에서 말한 PHP의 특징때문이다.
PHP 코드는 서버에서 실행되어 그 결과물이 HTML에 포함되어 전송되기 때문이다.
이렇게 전달된 HTML 코드에는 PHP 프로그램 코드가 직접 들어있지 않다.
그런데 미션은 ./upload/gKlIl1weasuc/flag.php 을 실행하는 것이 아니라, 읽는 것이다.
그럼 어떻게 PHP를 실행시키지 않고 코드를 읽을 수 있을까?
이 문제를 풀면서 발견한 오류를 통해 또 다른 힌트를 얻을 수 있는데,
오류 페이지를 통해 이 문제에서 아파치 서버를 사용한다는 걸 알아낼 수 있다.
[2] Apache 서버와 .htaccess 그리고 PHP 파일의 관계
이 문제에서 사용하는 아파치(Apache) 서버는 웹 사이트를 인터넷 상에서 접속 가능하게 만들어주는 프로그램이다.
컴퓨터에 있는 웹 페이지들을 다른 사람들에게 제공할 수 있도록 도와주는 역할을 한다.
그리고 또 알아야 할 존재가 있는데, 바로 .htaccess 파일이다. (htaccess는 "hypertext access"의 약자이다.)
.htaccess 파일은 아파치 서버의 한 부분으로, 특정 디렉터리와 그 하위 디렉터리에 대한 설정을 변경하고 관리하는 중요한 파일이다.
아파치와 같은 웹 서버에서 클라이언트의 요청을 받았을 때 어떤 방식으로 서비스를 제공할지를 결정하는 역할을 한다.
이를 통해 다양한 설정들을 적용하여 웹 애플리케이션의 동작을 세밀하게 제어할 수 있다.
( 예를 들어, 암호 보호, URL 리다이렉션, MIME 타입 설정 등 다양한 기능을 .htaccess 파일을 통해 구성할 수 있다.)
이제 이 문제가 아파치 서버를 사용하고 .htaccess 파일이 존재한다는 것을 알았으니, 이를 이용해서 문제를 풀 수 있다.
파일 업로드 디렉토리에 .htaccess 파일을 만들어서 그 안에서 PHP 파일을 실행하지 않도록 설정하면, 해당 PHP 파일이 텍스트 파일로 취급되어 소스 코드를 텍스트 형태로 볼 수 있다.
다음 지시문을 담는 .htaccess 란 이름의 파일을 업로드 하면 해당 디렉터리에서의 PHP 코드 실행을 무력화 시킬 수 있다.
따라서 해당 디렉터리에 있는 flag.php 를 보면 소스 코드가 그대로 보이게 된다.
php_flag engine off
위와 같이 파일을 업로드해주고,
./upload/gKlIl1weasuc/flag.php 에 들어가보면
flag 값을 읽을 수 있다!
정답~
새롭게 알게 된 개념들이 아주 많다!
아파치 서버, 디렉토리와 .htaccess 파일의 존재, php 파일 등등...
전부 다 깊게 이해하지는 못 했지만, 문제를 풀기 위해 최대한 이해하려고 노력했다.
부족한 부분이 있을 수 있다...
