입력값에 쿼리 조작 문자열 포함 여부를 확인하지 않고 쿼리문 생성 및 실행에 사용하는 경우 발생
입력값에 포함된 쿼리 조작 문자열에 의해 구조와 의미가 변경되어 의도하지 않은 형태의 쿼리가 실행
예상 피해
권한 밖의 데이터 조회, DBMS 서버의 제어권 탈취, 쿼리를 통해 제공할 기능 (서비스) 우회 등
SQL 인젝션 방어
시큐어코딩 기법
외부 입력값에 쿼리 조작 문자열이 포함되지 않도록 입력값 검증 후 사용
입력값에 쿼리 조작 문자열이 포함된 경우
입력값 오류 메시지와 함께 반환
입력값에 쿼리 조작 문자열을 제거 또는 의미 없도록 이스케이프 처리 후 사용
구조회된 쿼리, 파라미터화 된 쿼리를 실행
파이썬 execute 함수를 사용할 때
첫번째 인자에 쿼리문의 구조를 정의한 문자열을 정의한 튜플을 전달
두번째 인자에 쿼리문에 적용될 변수값을 정의한 튜플을 전달하는 것으로 방어 가능
공격이 확대되는 것을 방지
오류 메시지에 SQL 실행과 관련한 내용이 포함되지 않도록 처리
애플리케이션에서 사용하는 DB 사용자의 권한을 최소로 부여
코드 삽입
개요
공격자가 소프트웨어의 의도된 동작을 변경하도록 임의 코드를 삽입하여 소프트웨어가 비정상적으로 동작하도록 하는 공격 기법
코드 삽입 공격 유발 함수: eval(), exec() 등
예상 피해
권한 탈취, 인증 우회, 시스템 명령어 실행 등
eval() 함수 예제
exec() 함수 예제
코드 삽입 공격 방어
대응 방법
동적 코드를 실행할 수 있는 함수를 사용하지 않는다.
외부 입력값에 대하여 화이트리스트 방식으로 검증
유효한 문자만 포함하도록 사용자 입력값 필터링
경로 조작 및 자원 삽입
개요
검증되지 않은 외부 입력값을 통해 파일 및 서버 등 시스템 자원에 대한 접근 혹은 식별을 허용할 경우, 입력값 조작을 통해 시스템이 보호하는 자원에 임의로 접근할 수 있는 보안약점
경로 조작 및 자원 삽입 취약점 유발 함수: subprocess.Popen(), os.pipe(), socket 연결
예상 피해
자원의 수정/삭제, 시스템 정보 누출, 시스템 자원 간 충돌로 인한 서비스 장애
허용하지 않은 권한을 획득하여, 설정에 관계된 파일 변경 또는 실행이 가능
경로 조작 예제
자원 삽입 예제
경로 조작 및 자원 삽입 공격 방어
대응 방법
적절한 검증
사전에 정의된 리스트에서 선택
경로순회 공격의 위험이 있는 문자를 제거할 수 있는 필터 이용
/, \, . 등
XSS
개요
공격자가 전달한 스크립트 코드가 사용자 브라우저를 통해서 실행
예상 피해
사용자 브라우저 또는 PC의 정보를 탈취
가짜 페이지를 생성 후 사용자 입력을 유도하여 입력한 값을 탈취
희생자 PC의 제어권 탈취
Reflected XSS
입력값에 스크립트 포함 여부를 확인하지 않고 다음 화면 출력에 사용되는 경우에 발생
악의적인 스크립트가 포함된 url을 이메일, 메신저, 문자 등을 통해 사용자에게 노출시켜 사용자의 접근 유도
취약한 서버에는 공격자의 스크립트 코드가 남지 않으며, 공격자의 스크립트 코드를 전달하는 경유지로만 활용
Stored XSS
게시판과 같이 입력값을 저장하고 조회하는 기능을 제공하는 경우, 실행 가능한 스크립트 코드가 입력값과 출력값에 포함되었는지 여부를 확인하지 않고 사용하는 경우 발생
공격자가 악의적인 스크립트를 취약한 서버에 등록하고, 사용자가 해당 데이터에 접근 시 공격자가 저장한 스크립트가 실행
공격자의 스크립트 코드가 서버에 남아서 지속적으로 공격에 사용 -> Persistent XSS
DOM Based XSS
개발자가 작성한 스크립트 코드의 취약점을 활용한 공격 기법
실행 가능한 스크립트 코드 포함 여부를 확인하지 않고, 입력값을 DOM 객체 생성에 사용하는 경우 발생
서버와의 상호작용 없이 희생자 브라우저에서 악성 스크립트 코드가 실행
DOM (Documnet Object Model, 문서 객체 모델) - W3C의 표준 객체 모델 - XML이나 HTML 문서에 접근하기 위한 인터페이스 - 문서 내의 모든 요소를 계층 구조로 정의하고, 각각의 요소에 접근하는 방법을 제공
JavaScript를 이용한 DOM 변경
- 새로운 HTML 요소나 속성을 추가 - 존재하는 HTML 요소나 속성을 제거 - HTML 문서의 모든 HTML 요소를 변경 - HTML 문서의 모든 HTML 속성을 변경 - HTML 문서의 모든 CSS 스타일을 변경 - HTML 문서에 새로운 HTML 이벤트를 추가 - HTML 문서의 모든 HTML 이벤트에 반응
XSS 방어
시큐어코딩 기법
외부 입력값을 화면 출력에 사용하는 경우 실행 가능한 스크립트 코드가 포함되었는지 확인하고 사용
데이터베이스에 저장된 데이터를 화면 출력에 사용할 때 안전한 문자열로 이스케이프 해서 출력
웹 프로그래밍 언어 및 프레임워크에서 가이드하는 방법에 따라 구현
SSTI (Server Side Template Injection)
개요
웹 프레임워크의 서버 측 템플릿을 공격 벡터로 사용
공격자가 전달한 악성 페이로드가 서버 측에 실행되면서 생기는 취약점
템플릿에 사용자 입력이 포함되는 방식의 약점을 사용
예상 피해
웹 응용프로그램 내부를 파악하고 쉘 실행이 가능
SSTI 방어
사용자 입력이 템플릿 생성에 사용되지 않도록 해야 함
템플릿 문자열 생성 시 템플릿의 딜리미터가 포함되지 않도록 처리
위험한 형식의 파일 업로드
개요
서버 측에서 실행될 수 있는 스크립트 파일 (asp, jsp, php, sh 파일 등)이 업로드 가능하고, 이 파일을 공격자가 웹을 통해 직접 실행시킬 수 있는 경우, 시스템 내부 명령어를 실행하거나 외부와 연결하여 시스템을 제어할 수 있는 보안약점
eval() + exec()
예상 피해
시스템 제어
웹 쉘 (Web Shell) 공격
대응 방법
특정 파일 유형만 허용하도록 화이트리스트 방식으로 파일 유형 제한
파일 크기 및 파일 개수 제한
업로드 된 파일은 웹 루트 폴더 외부에 저장
업로드 되는 파일 이름을 추측할 수 없는 무작위 이름으로 변경하여 저장
업로드 된 파일을 저장하는 경우 최소 권한 부여 및 실행 여부를 확인하여 실행권한 삭제
민감한 데이터
개요
인증정보, 개인정보, 금융정보 등과 같은 민감한 정보를 안전하지 않은 방식으로 저장, 전송하는 경우, 제 3자에게 쉽게 노출, 공유되어 악용될 수 있음
예상 피해
중요 정보를 저장할 때는 암호화하지 않거나 잘못된 방식으로 암호화하는 경우, 사전 대입 공격, 레인보우 테이블을 이용한 공격 등으로 암호화된 정보를 쉽게 크래킹 할 수 있음
암호화하지 않은 데이터를 안전하지 않은 통신 채널을 통해 주고받는 경우, 스니핑, 중간자 공격 등을 통해 중요 정보를 쉽게 훔쳐보고 유출할 수 있음
스니핑 (Sniffing)
코를 킁킁거리다, 냄새를 맡다
해킹 기법으로서 스니핑은 네트워크 상에서 자신이 아닌 다른 상대방의 패킷 교환을 엿듣는 것을 의미
중간자 공격 (MITM, Man In The Middle)
네트워크 통신을 조작하여 통신 내용을 도청하거나 조작하는 공격 기법
통신을 연결하는 두 사람 사이에 중간자가 침입하며, 두 사람은 상대방에게 연결했다고 생각하지만 실제로는 두 사람은 중간자에게 연결되어 있으며 중간자가 한쪽에서 전달된 정보를 도청 및 조작한 후 다른 쪽으로 전달
스푸핑 (Spoofing)
"속이다"는 의미
네트워크에서 스푸핑 대상은 MAC 주소, IP 주소, 포트 등 네트워크 통신과 관련된 모든 것
속임을 이용한 공격을 총칭
민감한 데이터 처리 기법
민감한 데이터를 저장할 때는 반드시 암호화하여 저장
민감한 데이터를 전송할 때는 안전한 통신 채널을 사용
암호화에 사용하는 알고리즘은 보안성이 검증된 알고리즘을 사용
암호화 알고리즘의 보안 강도를 보장할 수 있는 암호화 키 길이를 사용
일방향 해시함수를 사용할 때는 반드시 솔트를 적용
취약한 암호 알고리즘
개요
중요정보 (금융정보, 개인정보, 인증정보 등)의 기밀성을 보장할 수 없는 취약한 암호화 알고리즘을 사용하여 정보가 노출 가능한 보안 약점
RC2 (ARC2), RC4 (ARC4), RC5, RC6, MD4, MD5, SHA1, DES 알고리즘 등
Python2 -> PyCrypto 사용
Python3 -> PyCryptodimes 사용
예상 피해
금융정보, 개인정보, 인증정보 등의 중요정보 노출
대응 방법
표준화되지 않은 암호화 알고리즘을 사용해서는 안됩니다.
학계 및 업계에서 이미 검증된 표준화된 알고리즘을 사용해야 함
기존에 취약하다고 알려진 암호 알고리즘 (DES, RC5 등)을 대신하여, 안전한 알고리즘 (AES, SEED 등)으로 대체하여 사용해야 합니다.
업무관련 내용, 개인정보 등에 대한 암호 알고리즘 적용 시, 암호모듈시험기관에서 안전성을 확인한 검증필 암호 모듈을 사용해야 합니다.
에러처리
개요
에러를 처리하지 않거나 불충분하게 처리하여 에러 정보에 중요정보 (시스템 내부 정보 등)가 포함될 때, 발생할 수 있는 취약점으로 에러를 부적절하게 처리하여 발생하는 보안약점
종류
오류 메시지 정보 노출
오류상황 대응 부재
부적절한 예외 처리
오류 메시지 정보 노출
개요
오류 메시지나 스택 정보에 시스템 내부구조가 포함되어 민감한 정보, 디버깅 정보가 노출 가능한 보안약점
응용프로그램이 실행환경, 사용자 등 관련 데이터에 대한 민감한 정보를 포함하는 오류 메시지를 생성하여 외부에 제공하는 경우, 공격자의 악성 행위를 도울 수 있음
예상 피해
예외 발생 시 예외 이름이나 트레이스백 (traceback)를 출력하는 경우, 프로그램 내부 구조를 쉽게 파악할 수 있음
대응 방법
오류 메시지는 정해진 사용자에게 유용한 최소한의 정보만 포함
소스코드에서 예외 상황은 내부적으로 처리하고 사용자에게 시스템 내부 정보 등 민감한 정보를 포함하는 오류를 출력하지 않도록 미리 정의된 메시지를 제공하도록 설정 -> Django 프레임워크에서는 urls.py에 사용자 정의 에러 페이지 핸들러를 정의할 수 있음
오류 상황 대응 부재
개요
시스템 오류 상황을 처리하지 않아 프로그램 실행 정지 등 의도하지 않은 상황이 발생 가능한 보안 약점
⚠️ 예외처리: 코드를 견고하게 만들고 프로그램 중지 등과 같은 잠재적인 오류 방지 가능
예상 피해
오류가 발생할 수 있는 부분을 확인하였으나 이러한 오류에 대하여 예외처리를 하지 않을 겨우, 공격자는 오류 상황을 악용하여 개발자가 의도하지 않은 방향으로 프로그램이 동작하도록 할 수 있음
부적절한 예외처리
개요
예외사항을 부적절하게 처리하여 의도하지 않은 상황이 발생 가능한 보안 약점
값을 반환하는 모든 함수의 결과값을 검사하여, 그 값이 의도했던 값이 검사하고, 예외처리를 사용하는 경우에 광범위한 예외 처리 대신 구체적인 예외 처리를 수행해야 함
예상 피해
프로그램 수행 중에 함수의 결과 값에 대한 적절한 처리 또는 예외 상황에 대한 조건을 적절하게 검사하지 않을 경우, 예기치 않은 문제를 야기할 수 있음