본 포스팅은 DreamHack 사이트의 Server-Side Basic 강의 내용을 요약한 것입니다.
https://dreamhack.io/

 

해커들의 놀이터, DreamHack

해킹과 보안에 대한 공부를 하고 싶은 학생, 안전한 코드를 작성하고 싶은 개발자, 보안 지식과 실력을 업그레이드 시키고 싶은 보안 전문가까지 함께 공부하고 연습하며 지식을 나누고 실력 향상을 할 수 있는 공간입니다.

dreamhack.io


이번에는 Server-Side basic입니다.

  • Injection

  • File vulnerability

  • Business Logic Vulnerability

  • Language specific Vulnerability

  • Misconfiguration

 

Injection

사용자의 입력 데이터가 어플리케이션의 처리 과정에서 구조나 문법적인 데이터로 해석되어 발생하는 취약점을 의미합니다.

 

SQL Injection

SQL 요청을 사용할 때 공격자의 입력 값이 정상적인 요청에 영향을 주는 취약점입니다.

SQL 쿼리에 사용자의 입력 데이터가 삽입되어 사용자가 원하는 쿼리를 실행하도록 할 수 있습니다. 일반적으로 데이터베이스의 자료를 추출하거나 삭제하는 등의 행위가 가능합니다.

SQL은 ' "(따음표)를 통해 문자열을 구분하기 때문에 이를 이용하여 공격이 가능합니다.

*SQL: 데이터베이스의 데이터를 정의하고 질의, 수정 등을 하기 위해 고안된 언어입니다. Mysql 카테고리에서 공부하고 있습니다.

이 공격을 막기 위해 권장되는 방법은 ORM과 같이 검증된 SQL 라이브러리를 사용하는 것입니다.

*ORM: SQL의 쿼리 작성을 편리하게 돕기 위한 라이브러리입니다.

 

Command Injection

OS Command를 사용 시 사용자의 입력 데이터에 의해 실행되는 Command를 변조할 수 있는 취약점입니다.

*OS Command: linux, wnidows 등 OS에서 사용되는 Command입니다.

이는 내부적으로 쉘을 이용해 실행할 수 있습니다. 쉘에는 한 줄에 여러 명령어를 실행하는 등의 쉘 사용자의 편의성을 위해 제공되는 특수 문자들이 존제하는데, 이를 이용한 공격이 Command Injection입니다.

이 공격을 막기 위해서는 사용자의 입력 데이터가 Command 인자가 아닌 다른 값으로 해석되는 것을 막아야합니다. 물론 가장 좋은 방법은 OS Command를 사용하지 않는 것이지만 사용해야 할 경우 필터링을 통해 Command  Injection을 방지해야 합니다.

 

Server Side Template Injection(SSTI)

템플릿 변환 도중 사용자의 입력 데이터가 템플릿으로 사용돼 발생하는 취약점입니다.

이 공격을 막기 위해서는 사용자의 입력 데이터를 Template Source에 삽입되지 않도록 해야합니다.

 

Path Traversal

URL / File path를 사용 시 사용자의 입력 데이터에 의해 임의의 경로에 접근하는 취약점입니다.

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

이는 사용자의 입력 데이터에 포함된 구분 문자가 인식되지 않도록 하여 방지할 수 있습니다.

 

Server Side Request Forgery(SSRF)

공격자가 서버에서 변조된 요청을 보낼 수 있는 취약점입니다.

웹 어플리케이션에서 요청을 보내는 방식으로 작동하고 있는 서버 내부의 포트, 서버와 연결된 내부망에 요청을 보낼 수 있습니다.

이 취약점을 방지하기 위해서는 사용자가 입력한 URL의 HOST를 화이트리스트 방식으로 검증하는 방법이 있습니다.

 

 

File Vulnerability

파일 업로드 취약점

사용자가 원하는 경로나 파일명으로 업로드하여 악영향을 미칠 수 있습니다

파일 업로드 기능은 사용자의 파일이 서버의 파일 시스템에 저장되어 처리된다는 이유로 인해 취약점이 발생할 수 있습니다. 서버의 파일 시스템에 원하는 파일을 저장할 수 있는거죠. 웹 서비스가 동작하는 경로에 사용자가 원하는 파일 내용과 파일 명을 업로드 할 수 있ㄷ면서버가 엔진에 요청하는 확장자를 업로드하여 서버의 웹 어플리케이션에 원하는 코드를 실행 할 수 있습니다.

파일 다운로드 취약점

의도하지 않은 파일을 다운로드 할 수 있습니다.

사용자가 입력한 파일 이름을 검증하지 않은 채 그대로 다운로드 시켜주게 되면 발생할 수 있습니다. Path Traversal을 이용하면 개발자가 의도한 폴더의 상위 경로에 존재하는 파일또한 다운로드 할 수 있습니다.

이를 방지하기 위해서는 기본적으로 인자에 다운로드 받으려는 파일의 경로나 이름을 넘기지 않는 것이 좋습니다. 또한 상대경로로 올라가는데 사용될 수 있는 문자를 적절하게 필터링해야 합니다.

 

 

Business Logic Vulnerability

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

 

IDOR(Inescure Direct Object Reference)

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

객체 참조 시 사용하는 객체 참조 키가 사용자에 의해 조작되었을 때 조작된 객체 참조 키를 통해 객체를 참조하고, 해당 객체 정보를 기반으로 로직이 수행되는 것을 의미합니다.

이 취약점은 사용자의 입력 데이터에 의해 참조하는 객체가 변하는 기능에서 사용자가 참조하고자 하는 객체에 대한 권한 검증이 올바르지 않아 발생합니다.

이를 방지하기 위해서는 객체 참조 시 사용자의 권한을 검증하는 것이 중요합니다. 즉 사용자가 의도한 권한을 벗어나 행동할 수 없도록 관리해야 합니다.

 

Race Condition

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

검증 과정에서의 데이터와 수정 과정에서의 데이터 차이로 인해 발생하게 됩니다.

 

 

Language Specific Vulnerability

공통

eval

인자로 입력된 문자열을 어플리케이션 코드로 실행합니다. 이를 이용해 악의적인 데이터를 입력할 수 있습니다.

OS Command Fulction

실행하는 명령어에 사용자의 입력 데이터가 포함될 경우 Command Injection이 발생할 수 있습니다.

Filesystem Function

파일 시스템에 접근할 수 있는 함수들의 인자가 사용자의 입력 데이터 또는 변조될 가능성이 있는 변수들을 사용할 경우 서버의 파일 시스템을 공격하거나 다른 취약점으로 악용될 수 있습니다.

Serialize / Deserialize (직렬화/ 역직렬화)

Serialize는 Object나 Data의 상태 또는 타입을 특정한 형태의 포멧을 가진 데이터로 변환하는 것을 의미합니다.

Deserialize는 Serialize 된 데이터를 원래의 Object나 Data의 상태 또는 타입으로 변환하는 것을 말합니다.

공격자는 Deserialize 과정에서 어플리케이션 상에서 다른 행위를 발생시키는 상태 또는 타입을 이용하여 악의적인 행위를 발생시키거나, 특정한 상황에서 호출되는 메소드들을 이용하여 공격에 사용합니다.

PHP

Include: 인자로 전달된 파일을 읽은 후 파일의 내용을 출력합니다. 파일의 내용에 php태그가 포함될 경우 php 코드가 실행되기 때문에 주의해야합니다.

Wrapper: 파일 시스템 관련 함수로 filename이 사용자의 입력이 될 경우 이를 이용해 의도와는 다른 행위를 발생시킬 수 있습니다.

Extract: 배열에서 변수를 가져옵니다. 이를 사용하면 기존 변수의 데이터를 덮을 수 있기 때문에 extract 함수에 사용자의 입력과 같은 신뢰할 수 없는 데이터가 사용되면 다른 변수를 변조하여 공격에 사용될 수 있습니다.

Type Juggling: 서로 다른 타입인 변수를 비교나 연산할 시 자동으로 형변환이 발생해 의도치 않은 결과가 나올 수 있습니다.

Comparison: Type-juggling에 의해 의도치 않은 결과가 발생할 수 있으니 정확한 비교를 하기 위해서는 동일한 타입인지도 비교하는 === 을 사용해야합니다.

Session: 기본 세션 경로가 지정되어 있고, 세션에서 사용되는 키를 사용자는 쿠키를 통해 알 수 있기 때문에 서버의 파일 시스템에서 세션 파일이 저장되는 경로와 파일을 추측할 수 있습니다. 세션에 사용자의 입력 데이터가 들어가면 다른 공격과 연계되어 사용될 수 있습니다.

Upload Logic: php 기본 설정에서 사용자의 요청 중 파일이 존재한다면 코드상에서 처리하는 로직이 존재하지 않더라도 임시 파일을 생성하는데, 이를 이용한다면 php 코드상에서 업로드 기능을 구현하지 않아도 사용자가 서버의 임시 디렉토리에 업로드가 가능합니다. 또한 임시 파일 생성 규칙도 예측이 가능합니다. 이런 문제점이 include나 다른 취약점과 연계되면 서버의 명령어를 실행시키는 등의 공격으로 연계될 수도 있습니다.

JavaScript

Comparison Problem: 타입이 다른 두 변수의 값을 비교할 때 비교문에서는 정상적으로 검증되지만, charAt 함수 호출 시 Array에 존재하지 않는 함수인 오류가 발생합니다.

Prototype Pollution: 객체를 생성할 때 초기화 할 프로토타입을 지정해주지 않으면 Object.prototype의 속성과 정의된 함수를 상속받습니다. 또한 같은 프로토타입을 상속받은 모든 객체는 메모리 상 같은 주소를 가리킵니다. 이 때문에 초기화하지 않은 여러 객체가 있을 때 문제가 발생합니다.

 

Misconfiguration

웹 서버, 데이터베이스 서버, 캐시 서버, 웹 프레임워크 등 모든 웹 어플리케이션 계층에서 발생할 수 있습니다.

잘못된 설정으로 인해 공격자는 허가되지 않은 동작을 수행할 수 있습니다. 이는 간단한 설정 오류로 인해 발생하며 자동화된 툴로 찾기 쉽습니다.

Debug: 디버그 모드 설정 또는 디버그 목적으로 코드 상에서 특정 정보를 사용자에게 제공할 경우 해당 정보를 기반으로 서버의 환경 및 정보가 노출될 수 있습니다.

Error Message Disclosure: 코드 상에서 사용하는 변수 또는 정보가 디버그 목적 등으로 사용자들에게 노출되는 경우도 있습니다.

임시/백업 파일: 이런 파일이 존재한다면 디렉토리 스캐너를 통해 파일이 유출될 수 있습니다.

개발 관련 파일: 버전 관리 도구(VCS)를 사용해 개발을 할 경우 해당 VCS가 자동으로 생성하는 정보 파일이 남는데, 이를 통해 소스코드를 획득할 수도 있습니다.

0.0.0.0 바인딩: 특정 네트워크에서만 접근할 수 있도록 되어야 할 서버가 0.0.0.0으로 되어있을 경우입니다. 이를 통해 공격자는 인증이 없거나 취약한 내부 서비스에 접근할 수 있게됩니다.

Nginx Alias Path Traversal: Nginx에서 경로를 설정할 때 alias, root 두 가지 방식이 있습니다. alias는 요청한 경로를 지시한 다른 경로로 변경하는 역할을, root는 해당 경로의 root 경로를 명시해주는 역할을 합니다. 이를 잘 이용한다면 한 단계 상위 디렉토리의 파일을 가져올 수 있게 됩니다.

Nginx Proxy SSRF: Nginx에서 외부 이미지를 다운받아 화면에 보여주는 URL을 (https://dreamhack.io/image/http://imageviewer.com/941ba06f-fb7e-46e1-bcba-55a1306d6aa7.png) 이렇게 구성하게 되면 취약점이 발생해 Nginx를 통해 내부 서비스 네트워크에 접근할 수 있게 됩니다.

 

'Hacking-기초 > WebHacking' 카테고리의 다른 글

파일 업로드/다운로드 취약점 공격  (0) 2020.05.27
Client-Side Advanced  (0) 2020.04.28
OWASP Top 10  (0) 2020.04.26
Client-side Basic  (0) 2020.04.21
Introduction of Webhacking  (0) 2020.04.18

+ Recent posts