[8기 기초] 4주차
OWASP TOP 10
01 - Broken Access Control | 접근 권한 취약점 |
02 - Cryptographic Failures | 암호화 오류 |
03 - Injection | 인젝션 |
04 - Insecure Design | 안전하지 않은 설계 |
05 - Security Misconfiguration | 보안 설정 오류 |
06 - Vulnerable and Outdated Components | 취약하고 오래된 요소 |
07 - Identification and Authentication Failures | 식별 및 인증 오류 |
08 - Software and Data Integrity Failures | 소프트웨어 및 데이터 무결성 오류 |
09 - Security Logging and Monitoring Failures | 보안 로깅 및 모니터링 실패 |
10 - Server-Side Request Forgery | 서버 측 요청 위조 |
SQL Injection
SQL(Structured Query Language)
: 관계형 데이터베이스 관리 시스템(DBMS)의 데이터를 관리하기 위해 설계된 프로그래밍 언어
SQL 문법
1. SELECT id FROM people;
people 테이블에서 ‘id’만 출력
2. SELECT * FROM people WHERE id=‘ironwater.kim’;
people 테이블에서 id가 ‘ironwater.kim’인 사람 검색
3. SELECT * FROM people WHERE id=‘zzang0505’ AND password=‘1234!@#$’;
people 테이블에서 id가 ‘zzang0505’고 password가 ‘1234!@#$’인 사람 검색
* 논리연산
SQL문의 WHERE 절을 항상 참으로 만드는 공격을 수행하는데 이용
기본적으로 논리 연산이 여러 개가 나열되면 NOT-AND-OR 순서로 계산
ex.
1 AND 1 OR 1 = 1
0 OR 1 AND 0 OR 1 = 1
0 OR 0 AND 1 = 0
1. Error Based SQL Injection
: 논리적 에러 이용하는 공격, 논리 연산을 이용하는 것이 일반적이며 인증 우회가 목적
SELECT * FROM Person WHERE id=’zzang0505’ and password=’1234!@#$’;
- Password가 항상 참이 되게 하려면 1234!@#$ 대신 항상 참이 되는 값 ‘or’1’=’1 입력
SELECT * FROM Person WHERE id=’zzang0505’ and password=’’or’1’=’1’
2. UNION based SQL Injection
: 여러 SQL문을 합쳐 실행할 수 있는 UNION을 이용하는 공격, 데이터 노출이 목적
SELECT name FROM A UNION SELECT name FROM B;
- A와 B의 name이 함께 출력
- UNION을 이용하여 모든 DB 출력 가능
SELECT id, name, phone FROM A WHERE name=’‘UNION SELECT null, null, null --’;
*조건: 컬럼 수와 데이터 형이 같아야 함
3. Blind SQL Injection
: 데이터베이스 메시지가 공격자에게 보이지 않는 경우에 사용하는 공격
Boolean based - 쿼리가 참일 때와 거짓일 때의 서버 반응으로 데이터를 얻어내는 공격 기법
Time based - 쿼리의 참과 거짓을 판별할 수 없는 경우 사용하는 공격 기법, 시간 지연시키는 쿼리를 주입하여 응답 시간 차로 참과 거짓 여부를 판별
방어
1. 입력값 검증
/, -, ‘, “, ;, =, select, from, union, where, … 등 의도하지 않은 입력을 검증하는 방법
2. Prepared statement 사용
쿼리를 사전에 컴파일하고 입력 변수 값만 삽입하는 방법
SQL 문법이 아닌 인터프리터나 컴파일러로 데이터를 처리하여 문법적인 의미를 가지지 않음
File Upload Vulnerability
: 악성 스크립트를 업로드하여 원격 코드를 실행할 수 있는 취약점
목적
1. 웹 서버를 통해 DB 정보 획득 - DB에 직접 접근할 수 없기 때문에 서버에 먼저 접근
(SQL Injection - 웹에 노출되는 정보를 하나씩 가져옴 <-> File Upload Vulnerability - 시스템에 침투한 후 원하는 대로 데이터를 가지고 옴)
2. 근접 네트워크 침투 (대상 : 내부 포탈 서버, 로그 서버 등 내부 시스템) - 포트포워딩, 터널링 기법 등을 통해 네트워크에 침투
원리
1. 확장자 제한 및 파일 접근/실행 권한이 있는지 확인
2. 파일 접근/실행이 가능하고 확장자 제한만 있는 취약한 웹 사이트라면?
→ Proxy 툴을 이용한 파일 타입 변조
→ Null 이용: Null(%00)은 문자의 끝을 의미하여 확장자를 숨길 수 있음
방어
1. 시큐어 코딩을 통한 확장자 검증 화이트리스트(허용 리스트) 허용으로 확장자 검증
화이트 리스트(안전이 증명된 것만을 허용) <-> 블랙 리스트: 악의성이 입증된 것을 차단
2. 시스템 보안 레벨 상승 서버를 분리해 관리하거나, 실행 권한 삭제
3. 지속적인 모니터링
XSS(Cross Site Scripting)
: 클라이언트 사이드 취약점 중 하나, 특정 계정의 세션 정보를 탈취하고 해당 계정으로 임의의 기능 수행 가능
1. Stored XSS
악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS
서버의 데이터베이스 또는 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생하는 XSS
게시물과 댓글에 악성 스크립트를 포함하여 업로드하는 방식이 대표적 → 불특정 다수에게 보여주기 때문에 높은 파급력이 있음
2. Reflected XSS
XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
서버가 악성 스크립트가 담긴 요청을 출력할 때 발생
게시판 서비스의 검색창에서 스크립트를 포함하여 검색하는 방식이 대표적 → 이용자가 게시물을 검색하면 서버에서는 검색 결과를 이용자에게 반환
- URL과 같은 이용자의 요청에 의해 발생 → 공격을 위해서는 타 이용자에게 악성 스크립트가 포함된 링크에 접속하도록 유도해야 함 (연계)
3. DOM 기반 XSS
* DOM(Document Object Model)
XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS
- 피해자의 브라우저가 HTML 페이지 구문 분석 시, 공격 스크립트가 DOM 생성 일부로 실행되면서 공격
- 페이지 자체는 변하지 않으나, 페이지에 있는 브라우저측 코드가 DOM 환경에서 악성코드로 실행
방어
1. 입력 값 제한
2. 입력 값 치환
3. 스크립트 영역에 출력 자제
CSRF(Cross-Site Request Forgery)
: 사이트 간 요청 위조
일반적으로 취약한 웹 사이트에서 이미 인증을 완료한 사람 → 공격 대상
XSS | CSRF |
공격대상: Client | 공격대상:Server |
사이트 변조나 백도어를 통해 클라이언트에 대한 악성공격 | 요청을 위조하여 사용자 권한을 이용하여 서버에 대한 악성공격 |
HTTP Request Method
GET method
: 클라이언트에서 서버로 어떠한 리소스로 부터 정보를 요청하기 위해 사용되는 메소드
URL에 Parameter를 붙여서 전송
- URL 뒤에 ?를 사용하여 Parameter를 작성하고, &을 붙여 여러 개의 Parameter를 구분하게 됨
- URL에 Parameter를 전송 → body영역을 사용하지 않음
- URL에 데이터를 실어 보냄 → 대용량 데이터 전송을 하기에 제한 사항 존재
POST method
: 리소스를 생성/업데이트하기 위해 서버에 데이터를 보내는 데 사용되는 메소드
GET과 달리 전송할 데이터를 HTTP 메시지 body 부분에 담아서 서버로 보냄
GET 기반
ex.
악성 사이트에서 Bob이 Joe에게 500달러를 이체하기 위해 위와 같은 url을 사용한다고 가정
악성 <img> 태그에서 위와 같이 url을 src 값으로 사용
Bob이 공격자의 사이트를 방문하면 HTTP 응답에 태그가 추가되고 브라우저는 뱅킹 사이트에 HTTP GET 요청을 보내게 됨
POST 기반
ex.
콘텐츠 유형으로 application/x-www-form-urlencoded나 text-plain을 사용한 POST 요청을 사용하는 경우
*콘텐츠 유형(Content-Type)
: HTTP 요청을 보낼 때 브라우저에 추가할 수 있는 헤더 수신자에게 HTTP 요청 본문의 인코딩 방법을 알려줌
히든 폼 기법
<input type="hidden">: 사용자에게는 보이지 않는 숨겨진 입력 필드를 정의
* 숨겨진 입력 필드 : 렌더링이 끝난 웹 페이지에서는 전혀 보이지 않음
폼 제출 시 사용자가 변경해선 안되는 데이터를 함 께 보낼 때 유용하게 사용