[모의해킹 스터디] 1주차 정리

바울·2024년 10월 21일
0

모의해킹 스터디

목록 보기
1/40

URL?

URL(Uniform Resource Locator)이란 사용자가 원하는 정보의 위치와 종류를 파악할 수 있도록 웹페이지의 정보 구조를 반영한 것이다.

URL 구조

http://www.example.com:80/docs/page.html?search=web&lang=en

  1. 프로토콜 (Protocol)
  • http://
  • URL의 제일 앞에 있는 http://는 브라우저와 서버 간의 통신 규칙을 나타냄. 클라이언트(브라우저)와 서버 간에 데이터를 어떻게 주고받을지 결정함
  • HTTP (Hypertext Transfer Protocol): 주로 텍스트 데이터를 전송하는 데 사용
  • HTTPS (HTTP Secure): HTTP의 보안 버전으로, 데이터를 암호화해서 안전하게 주고받음
  1. 호스트명 (Hostname)
  • www.example.com
  • 호스트명은 서버 이름 또는 IP 주소를 의미 쉽게 말해서 웹 페이지가 있는 서버의 위치를 알려줌
  • www는 보통 웹 사이트의 하위 도메인(subdomain)
  • example.com은 도메인 이름으로, 서버를 쉽게 식별할 수 있는 문자열 형식
  1. 포트 (Port)
  • :80
  • 포트는 서버가 네트워크 상에서 데이터를 주고받는 문 같은 역할
  • HTTP는 포트 80을, HTTPS는 포트 443을 기본으로 사용
  • 기본 포트를 사용할 때는 URL에 생략할 수 있음 예를 들어, HTTPS URL에 포트 443을 명시하지 않아도 접속가능
  1. 경로 (Path)
  • /docs/page.html
  • 경로는 서버에서 특정 리소스가 위치한 위치를 가리킴
  • /docs/는 폴더를, page.html은 그 안에 있는 HTML 파일을 의미
  • 여기서는 /docs/page.html로 docs 폴더 안의 page.html 파일을 요청하고 있음
  1. 쿼리 문자열 (Query String)
  • ?search=web&lang=en
  • 쿼리 문자열은 서버에 추가 정보를 전달할 때 사용
  • ?로 시작하고, &로 여러 쿼리를 연결할 수 있음
  • 각각 키=값 형식으로 되어 있고, 이 예시에서는 search=web: search라는 키에 web이라는 값이 할당됨
  • lang=en: lang 키는 언어 설정으로, en(영어)로 설정되어 있음
  • 이 쿼리 문자열은 서버에 검색어와 언어 설정을 전달해 주고 있음

Web Root?

웹 루트 경로(Web Root Path)는 웹 서버에서 클라이언트(사용자)가 요청한 웹 페이지나 파일이 실제로 저장되는 최상위 디렉터리

일반적인 웹 루트 경로의 예

  • Apache 웹 서버: 기본적으로 /var/www/html 또는 /usr/local/apache2/htdocs 경로를 사용 (이번 모의해킹 실습에서는 Apache 웹 서버를 사용할 예정임)

  • Nginx 웹 서버: 기본적으로 /usr/share/nginx/html 경로를 사용

웹 루트 경로의 역할

  1. 파일 저장: 웹 애플리케이션에서 필요한 모든 정적 파일(HTML, CSS, JavaScript, 이미지 등)을 저장하는 위치

  2. 보안: 웹 루트 경로 외부의 파일이나 디렉터리는 클라이언트가 직접 접근할 수 없으므로 보안을 강화하는 데 도움이 됨

  3. URL 매핑: 클라이언트가 요청하는 URL과 실제 파일의 경로를 매핑하는 기준점이 됨 예를 들어, http://example.com/index.html이라는 URL은 웹 루트 경로 내의 index.html 파일을 참조함

    웹 루트 경로를 적절하게 설정하고 관리하는 것은 웹 서버의 효율성과 보안을 유지하는 데 중요한 요소이다.

웹 루트 경로 변경

  • 운영체제: Rocky Linux 9.4 (Blue Onyx)
vi /etc/httpd/conf/httpd.conf

웹 루트 경로를 설정하는 부분은 DocumentRoot 부분이지만 접근 권한과 보안 관련 문제로 인해 Directory 부분도 같이 루트 경로에 맞게 수정해 줘야 한다.

Index file?

"Index file"은 웹 서버에서 기본적으로 로드되는 파일을 의미 사용자가 웹 사이트의 특정 디렉토리에 접근할 때, 서버는 해당 디렉토리에 있는 "index" 파일을 자동으로 찾고 이를 표시함

Index file 설정

  • 웹 서버의 설정 파일에서 어떤 파일을 index 파일로 사용할지를 지정할 수 있다.
vi /etc/httpd/conf/httpd.conf

DirectoryIndex index.html index.php
  • 이렇게 설정할 경우 웹 서버가 디렉토리에 접근할 때 index.html 파일을 먼저 찾고, 없으면 index.php 파일을 찾도록 지정할 수 있다.

Index file 예시

  • 현재 경로는 /var/www/html/proc로 index file이 있는 것을 볼 수 있다.

Index file 파일이 있을 경우

  • index file이 존재하기 때문에 경로로 접속할 경우 자동으로 index file이 로드되는 것을 볼 수 있다.

Index file 파일이 없을 경우

  • index file이 존재하지 않을 경우 Directory Listing이라는 취약점이 생길 수 있다.

Directory Listing

위에 처럼 index file 없을경우 특정 디렉터리 내 파일 및 디렉터리가 노출되고, 다운로드와 같은 작업도 가능한 상태이기 때문에 해당 웹 서버에 민감한 정보 등이 포함된 파일이 있을 경우 공격자에게 유출되는 문제가 발생할 수 있다.

index file은 각 directory마다 적용된다. 그렇다고 해서 모든 폴더마다 index file을 만들어 주기에는 힘들 거다.

대응 방안

vi /etc/httpd/conf/httpd.conf

  • Indexes 부분을 주석 처리해 주거나 지워준다.

  • 다시 접속해 보면 index file이 없을 경우 파일이나 디렉터리가 노출되지 않고 권한 문제로 인한 "Forbidden" 오류가 발생한다.

GET & POST

GET

  • 데이터 전송 방식: 요청 URL의 쿼리 문자열을 통해 데이터를 전송한다. 예:http://example.com/page?name=value
  • 용도: 주로 데이터를 요청할 때 사용됨, 웹 페이지를 가져오거나 검색 결과를 요청할 때 적합함.
  • 안전성: 서버의 상태를 변경하지 않는 안전한 요청, 주로 조회에 사용된다.
  • 캐시 가능: GET 요청은 캐시될 수 있고 브라우저나 서버가 이전 요청을 저장하여 재사용할 수 있다.

HTML 코드

<form action="proc/login_proc.php" method="GET"> <!-- GET 방식으로 데이터 전송 -->
            <label for="name">Username</label>
            <input type="text" name="name" required="">
            <label for="password">Password</label>
            <input type="password" name="passwd" required="">

서버로 요청 내용 확인

GET method는 요청 URL의 쿼리 문자열을 통해 데이터를 전송하는 것을 볼 수 있다.

POST

  • 데이터 전송 방식: 요청 본문(body)을 통해 데이터를 전송, URL에는 데이터가 포함되지 않는다.
  • 용도: 주로 데이터를 서버에 제출할 때 사용됨 예를 들어, 사용자 등록, 로그인, 파일 업로드 등의 경우에 사용된다.
  • 안전성: 서버의 상태를 변경할 수 있는 요청으로, 일반적으로 비 안전한 요청이다.
  • 캐시 불가: POST 요청은 일반적으로 캐시되지 않는다.

HTML 코드

<form action="proc/login_proc.php" method="POST"> <!-- POST 방식으로 데이터 전송 -->
            <label for="name">Username</label>
            <input type="text" name="name" required="">
            <label for="password">Password</label>
            <input type="password" name="passwd" required="">

서버로 요청 내용 확인

POST method는 URL의 쿼리 문자열을 통하지 않고 request body 부분에 파라미터를 넣어 보내는 것을 볼 수 있다. 이 데이터는 Content-Type 헤더에서 지정된 형식(application/x-www-form-urlencoded)에 따라 서버에 전송된다.

정적 페이지 & 동적 페이지

인터넷을 이용하면서 접속하게 되는 웹 페이지는 크게 두 가지로 나뉜다.
저장된 파일을 그대로 보는 정적 웹 페이지(Static Web Page)와 다른 변수들에 의해 변경되어 보이는 동적 웹 페이지(Dynamic Web Page)다.

정적 페이지 (Static Page)

정의

  • 정적 페이지는 서버에 저장된 HTML 파일이 그대로 클라이언트(브라우저)로 전달되는 페이지, 페이지 내용이 서버 측에서 미리 만들어져 있으며, 모든 사용자에게 동일한 내용을 제공한다.

특징

  • 변경 불가능: 콘텐츠가 고정되어 있어, 변경하려면 직접 HTML 파일을 수정해야 한다.

  • 서버 자원 적음: 서버에서 요청이 들어오면 미리 저장된 HTML 파일을 그대로 보내기 때문에 서버 자원이 적게 사용된다.

  • 빠른 로드 속도: 별도의 데이터베이스 조회나 서버 측 처리 없이 단순히 파일을 전달하기 때문에 빠르게 로드된다.

  • 사용 사례: 회사 소개 페이지, 포트폴리오, 블로그의 정적인 페이지 등.

예시 코드

<html>
  <head><title>About Us</title></head>
  <body>
    <h1>Welcome to Our Company</h1>
    <p>We provide the best services in the industry.</p>
  </body>
</html>

위 페이지는 항상 동일한 내용으로 제공된다.

동적 페이지 (Dynamic Page)

정의

  • 동적 페이지는 사용자의 요청에 따라 실시간으로 생성되며, 서버 측에서 특정 로직에 따라 페이지를 구성해 전달하는 페이지 PHP, Python, Ruby, Node.js 등 서버 측 프로그래밍 언어를 사용해 만들어진다.

특징

  • 실시간 콘텐츠 생성: 사용자 입력, 데이터베이스에서 조회된 정보, API 요청에 따라 실시간으로 콘텐츠가 생성된다.

  • 유연성: 사용자마다 다른 내용을 보여줄 수 있으며, 콘텐츠 변경이 데이터베이스나 서버 측 로직을 통해 쉽게 이루어진다.

  • 서버 자원 필요: 서버에서 사용자 요청을 처리하고, 데이터를 조회하거나 계산한 후 페이지를 생성하므로 서버 자원이 필요하다.

  • 사용 사례: 로그인 페이지, 상품 목록 페이지, 검색 결과 페이지 등.

예시 코드

<html>
  <head><title>Welcome</title></head>
  <body>
    <h1>Welcome, <?php echo $_SESSION['username']; ?></h1>
    <p>Your account balance is: <?php echo $account_balance; ?></p>
  </body>
</html>

위 페이지는 로그인한 사용자에 따라 각기 다른 username과 account_balance를 보여준다

WAS

WAS는 동적 웹 애플리케이션을 처리하기 위해 설계된 서버 소프트웨어 일반적인 정적 웹 서버와는 달리, 클라이언트의 요청에 따라 데이터를 처리하고, 이를 동적으로 생성된 웹 페이지로 응답한다. 이 과정에서 데이터베이스와의 연동, 사용자 입력 처리 등 복잡한 로직을 수행할 수 있다.

역할과 기능

  1. 동적 웹 페이지 처리: 사용자가 웹 페이지를 요청할 때, WAS는 서버 측에서 필요한 데이터를 처리하고, 그에 맞는 동적 콘텐츠를 생성한다. 예를 들어, PHP, JSP, ASP.NET 같은 서버 측 언어로 작성된 웹 애플리케이션 코드를 실행한다.

  2. 비즈니스 로직 수행: 단순히 파일을 제공하는 것이 아니라, 데이터베이스 연동, 사용자 인증, 세션 관리와 같은 비즈니스 로직을 처리한다. 이는 클라이언트의 요청마다 다른 결과를 반환할 수 있게 한다.

  3. 웹 서버와의 차이점: 웹 서버(예: Apache, Nginx)는 주로 정적 파일(HTML, 이미지)을 제공하는 데 사용되며, WAS는 이러한 웹 서버와 협력하여 동적인 콘텐츠를 처리한다. 웹 서버가 정적 자원을 클라이언트에게 전달하는 동안, WAS는 동적 애플리케이션 로직을 처리하여 데이터베이스에서 정보를 가져오거나 서버 측에서 코드를 실행한 후 그 결과를 웹 서버를 통해 사용자에게 전달한다.

대표적인 WAS

  • Apache Tomcat: 가장 많이 사용되는 WAS 중 하나로, Java Servlet과 JSP를 지원하는 서버이다.

  • JBoss (WildFly): Java EE 기반의 웹 애플리케이션 서버로, 대규모 엔터프라이즈 애플리케이션에 적합하다.

  • GlassFish: Oracle에서 개발한 Java EE 웹 애플리케이션 서버로, Java EE 표준을 준수한다.

  • WebLogic: Oracle에서 제공하는 상용 WAS로, 대규모 엔터프라이즈 시스템에 주로 사용된다.

  • Apache Web Server + PHP: PHP 기반 웹 애플리케이션 서버로, LAMP(Linux, Apache, MySQL, PHP) 환경에서 주로 사용된다.

0개의 댓글