웹해킹/개념

SERVER SIDE BASIC

DEEPY 2020. 5. 13. 01:18

드림핵 강의를 저의 학습을 위해 포스팅을 합니다.

introduction

서버에서는 사용자가 요청 한 데이터를 해석하고 처리한 후 사용자에게 응답합니다. 그 과정에서 웹 어플리케이션이나 데이터베이스와 같은 서버의 자원을 사용해 처리하기도 합니다. 이 과정에서 사용자의 요청 데이터에 의해 발생하는 취약점을 서버사이트 취약점이라고 한다.

 

 nc나 telnet과 같은 네트워크 프로그램을 통해 HTTP Request를 보낼 때는 조작 가능

 

개발과 운영 상의 실수로 인해 사용자의 데이터에 대한 검증 과정의 부재 또는 올바르지 않은 검증 과정의 사용으로 인해 취약점이 발생할 수 있습니다

 

 서버 내에 존재하는 사용자들의 정보를 탈취하거나, 서버의 권한을 장악하는 등

 서비스를 공격하는 것이 주 목적임

  • Injection (인젝션)

    서버의 처리 과정 중 사용자가 입력한 데이터가 처리 과정의 구조나 문법적으로 사용되어 발생하는 취약점입니다.

  • File vulnerability

    서버의 파일 시스템에 사용자가 원하는 행위를 할 수 있을 때 발생하는 취약점입니다.

  • Business Logic Vulnerability (비즈니스 로직 취약점)

    인젝션, 파일 관련 취약점들과는 다르게 정상적인 흐름을 악용하는 것을 의미합니다.

  • Language specific Vulnerability (PHP, Python, NodeJS)

    웹 어플리케이션에서 사용하는 언어의 특성으로 인해 발생하는 취약점을 다룹니다.

  • Misconfiguration

    잘못된 설정으로 인해 발생하는 취약점을 다룹니다.

 

Injection

인젝션은 우리말로 주입이라는 뜻으로, 사용자의 입력 데이터가 어플리케이션 처리과정에서 구조나 문법적인 데이터로 해석되어 발생하는 취약점을 의미한다. 변조된 입력을 주입하여 원래 목적을 변질시켜 예상치 못한 행위를 하도록 한 기법입니다.

 

sql injection , command injection , server side template injection , path traversal , server side request forgery

 

SQL Injection은 SQL 쿼리에 사용자의 입력 데이터가 삽입되어 사용자가 원하는 쿼리를 실행할 수 있는 취약점입니다. SQL Injection이 발생하게 되면 현재 쿼리를 실행시키는 DBMS 계정의 권한으로 공격이 가능하며 일반적으로 데이터베이스의 자료를 추출하거나 삭제하는 등의 행위가 가능합니다.

 

  • DDL (Data definition language)

    데이터를 정의하기 위한 언어입니다. 데이터를 저장하기 위한 스키마, 데이터베이스의 생성/수정/삭제 등의 행위를 수행합니다.

  • DML (Data manipulation language)

    데이터를 조작하기 위한 언어입니다. 실제 데이터베이스 내에 존재하는 데이터에 대해 조회/저장/수정/삭제 등의 행위를 수행합니다.

  • DCL (Data control language)

    데이터베이스의 접근 권한 등의 설정을 하기 위한 언어입니다. 데이터베이스내에 사용자의 사용 권한을 부여하기 위한 GRANT와 권한을 박탈하는 REVOKE가 대표적인 DCL입니다.

Command injection

웹 어플리케이션에서 os command를 사용하기 위해 php,node js, python. 과 같이 os command를 실행하는 함수가 구현되어 있습니다. os command란 linux(ls,pwd,ping,zip), windows(dir,pwd,ping) 등 os 에서 사용되는 command 이다.

 

일반적으로 웹 어플리케이션에서 os command를 사용하는 이유는 이미 기능을 구현한 os 실행 파일이 존재할때 코드 상에서 다시 구현하지 않고 os command로 실행하면 더 편리하기 때문이다.

 

OS Command는 내부적으로 쉘을 이용해 실행하는데, 쉘에는 한 줄에 여러 명령어를 실행하는 등의 쉘 사용자 편의성을 위해 제공하는 특수 문자들이 존재합니다. OS Command를 사용할 때 만약 사용자의 인풋이 검증되지 않고 그대로 OS Command 함수에 들어가게 된다면 오른쪽 탭의 특수 문자를 이용해 사용자가 원하는 명령어를 함께 실행하게 될 수도 있습니다.

 

Server Side Template Injection(SSTI)

웹 어플리케이션에서 동적인 내용을 html로 출력할때 미리 정의한 template에 동적인 값ㅇ을넣어 출력하는 template engine을 사용하기도 한다. 예를들어 내 정보를 출력해주는 페이지가 있으면 오른쪽 탭의 코드처럼 Template을 만들어 놓고 변수를 넣어 동적으로 HTML을 만들 수 있습니다.

만약 Template 내부에서 사용되는 context가 아닌 Template source에 사용자 입력이 들어가게 된다면 악의적인 입력을 통해 개발자가 의도하지 않은 임의의 Template 기능을 실행할 수 있습니다. 즉, 사용자의 입력 데이터가 Template에 직접 사용될 경우 template Engine이 해석하여 실행하는 문법을 사용할 수 있기 떄문에 SSTI취약점이 발생하게 됩니다.

SSTI 취약점을 막기 위해서는 사용자의 입력 데이터를 Template source에 삽입되지 않도록 해야합니다. 사용자의 입력 데이터를 Template에서 출력하기 위해서는 Template context에 값을 넣어 출력해야 합니다.

 

path traversal

Path가 사용되는 대표적인 로직으로는 URL/File이 있습니다. URL/File의 Path에는 Current Directory(상위 디렉터리)를 의미하는 구분자(..)가 있습니다. 예를 들어 /tmp/test/../a 경로가 해석되면 /tmp/test/의 상위 폴더인 /tmp/폴더의 하위에 있는 a  /tmp/a를 나타냅니다.

사용자의 입력 데이터가 적절한 검증 없이 URL/File Path에 직접적으로 사용될 경우 설계 및 개발 당시에 의도하지 않은 임의의 경로에 접근할 수 있는 Path Traversal 취약점이 발생하게 됩니다.

예를 들어 내부 api가 path variable로 입력 데이터를 받는 형식으로 구현되어있어 입력 데이터가 url path로 들어가는 경우도 있습니다. 즉, dream이라는 유저의 정보를 가져오기 위해 http://internal.dreamhack.io/api/user/dream 과 같이 내부 api에 요청을 하기 위해 사용자 입력이 url에 들어가기도 합니다. 사용자의 입력 데이터가 url path에서 사용될 경우 URL구분 문자를 사용하지 못하도록 하는 필터링 또는 인코딩 없이 사용하게 된다면 ../과 같은 구분 문자를 통해 의도한 경로가 아닌 상위 경로에 접근해 다른 api를 호출 할 수 있습니다.

오른쪽 탭에서 URL에서 사용되는 구분 문자들과 서버에서 해석되는 경로 및 인자가 어떻게 바뀌는지 확인해 볼 수 있습니다.

File Path에서 발생하는 Path Traversal은 File Vulnerability에서 자세히 다룹니다.

사용자의 입력 데이터가 경로로 사용되는 경우에는 URL Encoding과 같은 Encoding을 사용해 사용자의 입력 데이터에 포함된 구분 문자가 인식되지 않도록 할 수 있습니다. 이를 통해 Path Traversal 취약점을 방지할 수 있습니다.

 

File Vulnerability

파일을 업로드/다운로드 하는 기능에서 발생할 수 있는 취약점들과 취약점으로부터 안전하게 구현할 수 있는 방법들에 대해 알아보자

 

-파일 업로드 취약점 : 악영향을 미치는 파일이 업로드되는 취약점

-파일 다운로드 취약점 : 의도하지 않는 파일을 다운로드 할수 있는 취약점

 

파일 업로드 - 웹서비스를 통해 파일을 서버에 업로드하게 되는 기능, 사용자의 악성파일이 서버의 파일시스템에 검증없이 저장되어 악영향을 미칠수 있는 취약점

 

파일 업로드 취약점을 통해 원하는 대로 업로드할수 있다면 공격자는 웹 또는 서버의 서비스가 참조하는 파일을 업로드하여 공격함

 

CGI - 사용자의 요청을 받은 서버가 동적인 페이지를 구성하기위해 엔진에 요청을 보내고 엔진이 처리한 결과를 서버에게 변환하는 기능을 말한다.

 

Business Logic Vulnerability

비즈니스 로직은 규칙에 따라 데이터를 생성이나 표시,저장,변경같은 행위를 하는 알고리즘을 말한다.

ex) 회원가입/로그인/게시물 작성 등 다양한 로직이 모여 서비스가 만들어진다.

 

이 취약점은 비즈니스 로직을 악용하는 것을 의마하는데, 인젝션,파일 관련 취약점들은 공격자의 악의적인 데이터가 서버의 시스템 상에서 나쁜 영향을 미치는 공격을 행하지만, 비즈니스 로직 취약점은 서비스의 기능에서 적용되어야 할 로직이 없거나 잘못 설계된 경우 발생하게 된다.

  • Business Logic Vulnerability

    정상적인 흐름에서 검증 과정의 부재 및 미흡으로 인해 정상적인 흐름이 악용되는 취약점입니다.

  • IDOR (Insecure Direct Object Reference)

    변조된 파라미터 값이 다른 사용자의 오브젝트 값을 참조할 때 발생하는 취약점입니다.

  • Race Condition

    비즈니스 로직의 순서가 잘못되거나, 한 오브젝트에 여러 요청이 동시에 처리되는 상황에서 발생하는 취약점입니다.

Language specific Vulnerablility

이 취약점은 해당 언어만의 특성과 그 언어의 함수에서만 발생할수 있는 취약점이다.

 

공통요소

-코드 실행 함수

eval 함수 : 인자로 입력된 문자열을 어플리케이션 코드로 실행됨

-os command function

  • Python

    • os.system, popen

    • subprocess.call, run, Popen

  • PHP

    • system, passthru

    • shell_exec, backtick operator (e.g. `ls`)

    • popen, proc_open

    • exec

  • Javascript (Nodejs)

    • child_process.exec, spawn

-filesystem function : 어플리케이션에서 파일 시스템에 접근할 수 있는 함수들의 인자가 사용자의 입력 데이터 등을 사용할 경우 서퍼의 파일을 공격할수 있음

 

  • File Read

    • 어플리케이션 코드, 설정 파일 정보 등의 노출

  • File Write

    • WebShell 생성을 통한 원격 코드 실행 공격

    • 기존 설정 파일을 덮는 공격을 통해 운영체제 또는 어플리케이션 설정 변경

  • Etc

    • 파일 복사를 통해 File Write와 유사한 상황 발생

    • 설정 파일을 삭제하여 운영체제 또는 어플리케이션 서비스 무력화

 

-serialize/deserialize : 직렬화는 오브젝트나 데이터의 상태 또는 타입을 특정한 형태의 포맷을 가진 데이터로 변환하는 것을 의미하고 역직렬화는 직렬화된 데이터를 원래의 오브젝트나 데이터의 상태로 변환하는것을 의미

 

 

 

 

php

-include

-wrappers

-extract

-type juggling

-comparison

-session

-upload logic

 

javascript

-comparison problem

-prototype pollution

 

 

 

 

 

- 게- 게시물 수정 비즈니스 로직1. 사용자가 게시물 수정을 요청한다.2. 로그인된 사용자인지 확인한다.3. 수정을 요청한 사용bb자가 해bb당 게시물을 수정 할 수 있는 권한인지 확인한다.4. 2,3번 과정이 확인되면 데이터베이스에 사용자가 입력한 정보로 수정한시물 수정 비즈니스 로직1. 사용자가 게시물 수정을 요청한다.2. 로그인된 사용자인지 확인한다.3. 수정을 요청한 사용자가 해당 게시물을 수정 할 수 있는 권한인지 확인한다.4. 2,3번 과정이 확인되면 데이터베이스에 사용자가 입력한