웹 해킹 기초

2025. 1. 9. 17:29·Security/Web Hacking

1. Proxy

프록시를 말 그대로 번역하면 대리라는 뜻을 가진다.

 

프록시(Proxy)는 대개로 '네트워크 환경에서 클라이언트와 서버 사이에서 중계 역할을 하는 시스템이나 소프트웨어'를 말한다. 하지만 프록시가 꼭 중계 서버의 의미만을 가지는 것은 아니다. 객체지향 프로그래밍에서 하나의 객체가 다른 객체의 요청을 대신 처리 할 때도 프록시라는 말을 사용한다.(AOP와 관련된 기능 구현이나 의존성 주입, 트랜잭션 관리를 하게 되는 경우)

@Service
public class UserService {
    @Transactional
    public void performTransaction() {
        // 비즈니스 로직 실행
    }
}

 

@Entity
public class User {
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Order> orders;
}

 

 

오늘은 프록시 서버에 대해서만 정리해보려고 한다.

프록시 서버를 사용하는 이유는 다음과 같다.

1. 익명성 제공 : 사용자의 IP 주소를 숨기고 프록시 서버의 IP 주소를 대신 사용하여 익명성을 강화함

2. 캐싱 : 자주 요청되는 데이터를 저장하여 다음 요청 시 더 빠르게 응답함

3. 보안 강화 : 트래픽을 모니터링하고 불필요하거나 악의적인 요청을 차단하여 보안을 강화함

4. 우회 : 지리적 제한이나 특정 콘텐츠에 대한 접근 제한을 우회할 수 있도록 도와줌(VPN과 비슷하지만 같은 것은 X, 밑에서 더 다룰 예정)

5. 접근 제어 : 특정 웹사이트나 서비스를 차단하거나 사용자 활동을 관리함

 

프록시는 보안 강화의 목적이 가장 크지만, 일반적으로 개발자들이 API 테스트를 하거나 네트워크 문제를 디버깅 할 때도 사용된다.

 


2. VPN

VPN(Virtual Private Network)의 사전적 의미는 '가상 사설 네트워크'이며 네트워크 상의 의미는 '공용 네트워크를 사용하여 데이터를 암호화하고 안전하게 전송할 수 있도록 해주는 기술'이다.

 

데이터를 암호화해서 전송한다는 점에서 위에서 말한 Proxy서버와 차이점을 가진다.

 

VPN의 특징

1. 암호화 : 데이터를 VPN 클라이언트에서 암호화된 상태로 VPN 서버로 전송

2. 가상 터널 : 클라이언트와 서버 간에 외부로부터 격리된 가상 터널을 형성하여 데이터를 안전하게 전송

3. 익명성 : 사용자의 IP 주소가 VPN 서버의 IP 주소로 대체됨

4. 보안 : 공용 Wi-Fi 환경에서도 데이터를 암호화하여 안전하게 보호

5. 원격 접속 : 사용자는 원격지에서도 회사나 사설 네트워크에 접속하여 내부 리소스에 접근 가능

6. 지역 제한 우회 : VPN은 다른 국가의 서버를 통해 접속하므로, 지역 제한된 콘텐츠에 접근할 수 있음

 

VPN의 용도

- 민감한 정보 전송 시 안전성 확보

- 사용자의 IP 주소와 위치를 숨겨 익명성을 강화, ISP(인터넷 서비스 제공자)나 정부의 트래픽 모니터링 방지

- 회사 네트워크에 원격으로 안전하게 접속하여 내부 시스템 및 리소스에 접근

- 넷플릭스, 유튜브, 온라인 게임 등 지역 제한 콘텐츠에 접근

- 검열 우회(ex: 특정 국가에서 차단된 웹사이트에 접속하는 경우)

- 파일 전송 시 IP를 숨기고 암호화하여 보안성 향상

 


 

3. HTTP 

HTTP(HyperText Transfer Protocol)란 웹 상에서 클라이언트와 서버 간에 데이터를 주고받기 위한 프로토콜이며 하이퍼텍스트 문서(HTML), 이미지, 동영상 등 다양한 리소스를 전송하기 위한 표준을 말한다.

 

HTTP의 특징

- 비연결성 : 서버는 클라이언트 요청을 처리한 후 연결을 끊고 이후 요청이 오면 새로운 연결을 만든다.(이를 보완하기 위해 HTTP/1.1부터 지속 연결 기능이 도입됨)

- 상태 비저장성 : HTTP는 요청 간에 상태를 유지하지 않기 때문에, 클라이언트가 상태를 유지하려면 쿠키(Cookie), 세션(Session) 등을 사용해야 한다.

- 유연성 : 다양한 데이터 형식(HTML, JSON, XML 등)을 전송할 수 있다.

- TCP/IP 기반 : HTTP는 주로 TCP/IP 프로토콜(인터넷에서 데이터를 주고받기 위한 규칙이며 TCP는 데이터를 안전하게 전달하고, IP는 데이터를 올바른 주소로 보내는 역할을 수행함) 위에서 동작하며, 요청-응답 구조로 데이터를 주고받는다.

 

HTTP의 요청 방식

1. Request(클라이언트가 서버에 특정 작업을 요청)

- 요청 메시지에는 요청 라인(요청 메소드, URL, HTTP 버전), Header(인증 정보, 콘텐츠 타입와 같은 부가 정보), Body(전송할 데이터)가 포함된다.

 

2. Response(서버가 요청을 처리하고 결과를 반환)

- 응답 메시지에는 상태코드(200, 404, 500과 같은 요청 처리 결과), Header(캐시 제어, 콘텐츠 길이와 같은 응답 관련 정보), Body(HTML, JSON과 같은 요청한 데이터)가 포함된다.

 

Request / Response

 

 

HTTP 메소드 

HTTP 메서드란 클라이언트와 서버 사이에 이루어지는 요청, 응답에 대한 데이터 전송 방식을 말한다. 메소드의 종류로는 GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, CONNECT, TRACE가 있으며 이 중에 자주 사용되는 메소드는 GET, POST, PUT, PATCH, DELETE 메소드이다.

 

HTTP Method

 

 

HTTP 응답코드

HTTP 응답코드로는 1XX번대부터 5XX번대까지 있지만 자주보게 되는 응답코드는 2XX(요청에 대한 응답을 성공적으로 반환함)번, 4XX(클라이언트 측에서 잘못된 요청을 한 경우)번, 5XX(서버 측에서 요청을 처리하는 과정 중에 문제가 발생한 경우)가 있다.

4XX번대 응답코드
5XX번대 응답코드

 


4. HTTPS

 

HTTPS(HyperText Transfer Protocol Secure)란 HTTP에 SSL/TLS(웹 브라우저와 서버 간의 데이터를 몰래 보거나 조작하지 못하게 보호)암호화 기술을 추가한 프로토콜을 말한다.

 

HTTPS의 특징

- 데이터 암호화 : 평문(Plain Text)이 아닌 암호화된 데이터가 전송되므로, 외부에서 내용을 볼 수 없음

- 데이터 무결성 보장 : 데이터를 전송하는 중간에 위변조되지 않았음을 보장하며 데이터가 변경되거나 손상되면 이를 탐지할 수 있음

- 인증 : SSL/TLS 인증서를 사용해 서버가 신뢰할 수 있는 기관(CA, Certificate Authority)에 의해 인증되었음을 증명함

- 기존 HTTP와 호환 : HTTPS는 기존 HTTP 프로토콜을 기반으로 동작하므로, HTTP와 대부분의 기능이 동일함

- 포트 번호 : 기본적으로 443번 포트를 사용함

 

HTTP와 HTTPS의 차이

 

HTTPS의 동작 방식(SSL/TLS 핸드셰이크 과정을 통해 암호화된 통신을 설정)

1. 클라이언트가 서버에 연결 요청 : 사용자가 HTTPS URL로 접속하면, 브라우저가 서버에 연결 요청을 보냄

2. 서버 인증서 제공 : 서버의 공개키와 인증 정보가 포함된 SSL/TLS 인증서를 클라이언트에 보냄

3. 인증서 검증 : 클라이언트는 인증서의 유효성을 확인하고 암호화된 세션 키를 생성

4. 세션 키 교환 : 클라이언트는 공개 키로 세션 키를 암호화해 서버로 전송하고 서버는 자신의 개인 키로 이를 복호화하여 세션 키를 얻음

5. 암호화된 데이터 전송 : 클라이언트와 서버는 세션 키를 사용해 데이터를 암호화하고 안전하게 통신

 


 

5. PHP 그리고 싱글쿼터(') / 더블쿼터(")

PHP(Hypertext Preprocessor)는 C언어 기반 서버 사이드 스크립트 언어로 동적 웹 페이지와 웹 애플리케이션을 개발하는 데 사용된다. Hypertext Preprocessor라는 이름은 HTML과 같은 정적 콘텐츠에 동적인 기능을 추가할 수 있다는 점을 강조한다.

 

싱글쿼터(')와 더블쿼터(")는 PHP에서 문자열을 정의할 때 사용되는데, 각각 처리 방식에 있어서 차이가 있고 시큐어 코딩에 있어 중요하기 때문에 정리를 해두려고 한다.

 

싱클쿼터(')는 문자열 내부에 있는 모든 내용을 그대로 출력하며 변수나 이스케이프 시퀀스는 동작하지 않는다.(단, \와 '\는 예외)

$var = "world";
echo 'Hello $var'; // 출력: Hello $var
echo 'It\'s PHP!'; // 출력: It's PHP!

 

더블쿼터(")는 문자열 내부에 있는 변수나 이스케이프 시퀀스를 해석하여 처리하며 변수를 문자열에 포함하거나, 줄바꿈(\n)과 같은 특수 문자를 사용할 수 있다.

$var = "world";
echo "Hello $var"; // 출력: Hello world
echo "Line 1\nLine 2"; // 출력: Line 1 (줄 바꿈) Line 2

 

 

위와 같은 차이점이 있기 때문에 SQL 쿼리를 작성 시 변수 삽입이 가능한 더블쿼터 사용을 조심해야 한다. 사용자의 입력 값이 쿼리에 그대로 포함되면, 공격자가 SQL 인젝션 공격을 시도할 수도 있기 때문이다. 

// 취약한 코드 (더블쿼터 사용)
$user_input = "1' OR '1'='1";
$sql = "SELECT * FROM users WHERE id = '$user_input'"; 
// 결과: SELECT * FROM users WHERE id = '1' OR '1'='1'; (SQL 인젝션 발생)

// 개선된 코드 (싱글쿼터 사용)
$sql = 'SELECT * FROM users WHERE id = \'' . addslashes($user_input) . '\'';

 

뿐만 아니라 더블쿼터는 변수를 해석하기 때문에, 사용자 입력을 변수로 직접 포함하는 경우 문제가 발생할 수 있다. 따라서, 변수 해석이 필요 없는 경우 싱글쿼터를 사용하고 더블쿼터를 사용할 때는 반드시 입력 검증 및 이스케이프 처리를 통해 보안을 강화해야 한다.

 


 

6.  URL Encoding, Decoding

URL Encoding

URL Encoding이란 URL에서 사용 불가능한 문자나 특수 문자를 인코딩(변환)하여 안전하게 전송할 수 있도록 만드는 과정을 말한다.

이는 공백, 특수 문자, 비영문 알파벳 등의 문자가 URL 문법 규칙에 있어서 문제가 될 수 있기 때문이다. 

 

인코딩 방식은 간단하다. 허용되지 않는 문자가 있다면, % 기호 뒤에 해당 문자의 ASCII 값(16진수)를 붙여 표현하면 된다.

 

예)

 

  • 공백: %20
  • 슬래시(/): %2F
  • 콜론(:): %3A

허용되는 문자 : 알파벳, 숫자, 일부 특수 문자( - , _ , . , ~ )

허용되지 않는 문자 : 공백, 제어 문자(줄바꿈, 탭 등), 특수 문자(<, >, #, %, {, }, |, \, ^, ~, [, ], `, ", ')

 

Encoding 예시

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class UrlEncodingExample {
    public static void main(String[] args) {
        try {
            // 검색어
            String searchQuery = "Apple iPhone 16";
            
            // URL 인코딩
            String encodedQuery = URLEncoder.encode(searchQuery, "UTF-8");
            
            // 쇼핑몰 검색 URL 생성
            String url = "https://www.mnsoo.com/search?q=" + encodedQuery;
            System.out.println("Encoded Search URL: " + url);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

 

출력 결과 :

Encoded Search URL: https://www.mnsoo.com/search?q=Apple%20iPhone%2016

 

반대로, URL Decoding은 변환된 문자열을 원래의 문자로 복원하는 과정을 말한다.

 

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

public class UrlDecodingExample {
    public static void main(String[] args) {
        try {
            // 인코딩된 검색어
            String encodedQuery = "Apple%20iPhone%2016";
            
            // 디코딩
            String decodedQuery = URLDecoder.decode(encodedQuery, "UTF-8");
            
            // 원래의 상품명 출력
            System.out.println("Decoded Search Query: " + decodedQuery);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

출력 결과 : 

Decoded Search Query: Apple iPhone 16

 


 

7. Client Side / Server Side

Client Side

클라이언트 사이드란 웹 애플리케이션에서 클라이언트, 즉 사용자의 웹 브라우저에서 실행되는 코드나 프로세스를 의미한다. 클라이언트 사이드에서는 HTML, CSS, JavaScript와 같은 기술을 사용하여 동적인 사용자 인터페이스(UI)를 구성하는 것 뿐만 아니라, JavaScript를 사용하여 클라이언트에서 직접 데이터를 처리하거나, 서버와의 비동기 통신(AJAX)을 통해 데이터를 받아올 수 있다. 

 

Server Side

서버 사이드란 웹 애플리케이션에서 서버에서 실행되는 코드나 프로세스를 의미한다. 서버 사이드는 클라이언트가 보내는 요청(예: 페이지 요청, 폼 데이터 전송 등)을 처리하여 결과를 동적으로 생성하거나 데이터베이스에 접근하여 정보를 반환하는 역할을 수행한다.

 

클라이언트와 서버 사이드 모두 데이터를 처리할 수 있는 방법을 가지고 있지만 방식마다 장단점이 존재한다. 꼭 UI와 관련된 코드를 Client Side에서 실행하고 데이터와 관련된 코드만 Server Side에서 처리해야 하는 것이 아니다. 효율적이고 성능 좋은 서비스를 만들기 위해서는 각 사이드에서 어떤 데이터를 처리할 것인지 적절히 분배하는 것이 중요하다.

 

각 사이드에서 데이터를 처리할 때의 장단점 : 

 


 

8. 상대 경로 / 절대 경로

상대 경로란 현재 위치를 기준으로 파일이나 디렉토리의 위치를 지정하는 방법이다. 상대 경로는 파일이나 디렉토리가 어디에 위치하든지 그 위치를 기준으로 다른 파일이나 디렉토리를 참조한다.

 

예시) 

파일 시스템의 경우 : ../image.png

웹 개발의 경우 : <a href="about.html">About Me</a>

 

절대 경로란 파일 시스템의 루트 디렉토리부터 시작하여 파일이나 디렉토리의 위치를 지정하는 방법이다. 절대 경로는 파일이 시스템 내에서 어디에 위치하는지 상관없이 그 위치를 정확하게 지정한다. 

 

예시)

파일 시스템의 경우 : /home/user/docs/file.html

웹 개발의 경우 : <a href="http://www.mnsoo.com/about.html">About Me</a>

 

특히 웹 개발을 할 때 절대 경로보다는 상대 경로를 작성하는 것이 선호된다. 그 이유는 절대 경로를 사용하면 로컬 시스템에서만 동작하거나 특정 서버에서만 동작할 수 있지만 상대 경로를 사용하면 파일 위치에 상관없이 동일하게 동작하므로 여러 환경에서 사용하기 더 좋기 때문이다. 또한, 코드의 재사용성과 유지 보수가 용이해지기 때문에 상대 경로를 더 많이 사용한다.

 


 

9. HTML / CSS / Javascript

HTML이란 웹 페이지의 구조를 정의하는 마크업 언어로, 웹 페이지에서 텍스트, 이미지, 비디오, 링크 등 다양한 콘텐츠를 구성하고 표시하는 데 사용된다. 

 

HTML의 특징

- 태그 기반 : HTML은 태그를 사용하여 웹 페이지를 구성하며 각 태그는 웹 브라우저에 어떤 내용을 표시할지 지시한다.

- 링크 연결 : 하이퍼링크를 통해 다른 웹 페이지로 연결할 수 있다.

- 표준화 : HTML은 W3C(World Wide Web Consortium) 표준을 따르기 때문에 웹 페이지가 일관되게 동작하도록 한다.

- 다양한 미디어 : HTML은 이미지, 비디오, 오디오 파일 등 다양한 미디어를 삽입할 수 있다.

 

CSS란 Cascading Style Sheets의 약자로 HTML 문서의 스타일링(디자인)을 담당한다. HTML은 페이지의 구조를 정의하지만, CSS는 그 구조에 색상, 폰트, 배치 등을 적용하여 시각적으로 꾸미는 것을 도와준다.

 

Javascript란 웹 페이지에 동적인 기능을 추가하는 프로그래밍 언어이다. HTML과 CSS가 페이지의 구조와 스타일을 담당하는 반면, JavaScript는 페이지에서 일어나는 동적인 기능(클릭 이벤트 처리, 폼 유효성 검사, 애니메이션 효과 등)처리, 서버와의 통신, DOM을 통해 HTML 요소를 변경하고 조작하는 역할을 수행한다.

 

Javascript의 특징

- 클라이언트 사이드 언어 : 서버와의 상호작용 없이 페이지의 동적인 요소를 처리한다.

- 객체지향 및 함수형 언어 

- 비동기 처리 : JavaScript는 비동기 프로그래밍을 지원하여, 사용자 인터페이스를 차단하지 않고 백그라운드에서 데이터를 처리할 수 있다.

- 동적 타이핑 : JavaScript는 변수에 타입을 명시하지 않고 사용하며, 타입이 동적으로 결정된다.

- 브라우저와 상호작용 : DOM API를 통해 HTML 요소를 실시간으로 수정하고 이벤트를 처리한다.

 

사람 몸에 비유해서 정리하자면, HTML은 뼈대, CSS는 피부, Javascript는 근육의 역할을 맡는다.

 

HTML과 Javascript의 호환성

HTML과 JavaScript는 웹 페이지의 동작을 함께 정의하고 처리하기 위해 설계되었다. HTML은 웹 페이지의 구조적 부분을, JavaScript는 동적 기능을 제공하여 둘 사이에서 자연스러운 호환성을 제공한다. 

 

- DOM : JavaScript는 DOM(HTML 문서의 구조를 객체 모델로 표현한 것)을 통해 HTML 요소에 접근하고 이를 동적으로 수정한다.

- 이벤트 기반 처리 : JavaScript는 HTML 요소에 이벤트 리스너를 붙여 사용자의 상호작용(예: 클릭, 입력 등)에 반응하도록 한다.

'Security > Web Hacking' 카테고리의 다른 글

웹 해킹 기초 - 코드 리뷰  (0) 2025.01.22
웹해킹 기초 문제 풀이 - 1  (0) 2025.01.22
전공 세미나 수업 - 해킹과 SQL 인젝션에 대하여  (0) 2022.12.22
IP  (0) 2022.12.21
웹 보안  (0) 2022.12.13
'Security/Web Hacking' 카테고리의 다른 글
  • 웹 해킹 기초 - 코드 리뷰
  • 웹해킹 기초 문제 풀이 - 1
  • 전공 세미나 수업 - 해킹과 SQL 인젝션에 대하여
  • IP
switch_user
switch_user
나의 공부 기록
  • switch_user
    while(true)
    switch_user
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C
      • C++
      • Java
      • Python
      • Web
      • App
      • Security
        • Web Hacking
        • Reverse Engineering
      • DB
      • Machine Learning
      • Computer Science
      • Linux
      • Algorithm
      • 진로
      • 기타
  • 블로그 메뉴

    • 홈
    • 태그
    • velog
    • Github
  • 링크

    • velog
    • Github
  • 공지사항

  • 인기 글

  • 태그

    HTML
    쿠키
    xss
    SQLi
    어셈블리
    디컴파일
    IDA
    클래스 외부에 함수 구현
    어셈블리어
    배치 학습
    SQL
    ml
    머신러닝
    HTTP
    반복문
    모델 기반 학습
    Hacking Process
    웹
    생성자와 소멸자
    사례 기반 학습
    CSS
    비트연산
    리버싱
    race condition
    x64dbg
    인터프리팅
    Web 기초
    cin.getline
    코드 패치
    웹해킹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
switch_user
웹 해킹 기초
상단으로

티스토리툴바