본문 바로가기
개발 관련 강의 정리/10분 테코톡

[10분 테코톡] 바니의 웹 보안 정리

by 코딩개발 2023. 5. 11.
728x90
반응형

OWASP Top 10

 

Open Web Application Security Project 라는 비영리 보안 프로젝트 재단

 

웹 애플리케이션에 발생할 수 있는 취약점을 분석하고 연구해 공격 가능성과 기술적 영향을 기준으로 10개의 취약점 OWASP Top 10을 공개

 

OWASP Top 10 (Ver. 2021)

  A01: Broken Access Control

  A02: Cryptographic Failures

  A03: Injection

  A04: Insecure Design

  A05: Security Misconfiguration

  A06: Vulnerable and Outdate Components
  A07: Identification and Authentication Failures
  A08: Software and Data Integrity Failures
  A09: Security Logging and Monitoring
  A10: Server-side Request Forgery


"Injection"
신뢰할 수 없는 데이터가 명령어나 쿼리문의 일부분으로 전달될 때 발생
공격자의 악의적인 데이터로 인해
"예기치 않은 명령이 실행되거나 올바른 권한 없이 데이터에 접근"하는 공격 기법

Injection 공격기법은 여전히 높은 위치에 있는 중요한 보안점이다.

 

 

"SQL Injection"SQL 삽입. SQL 주입이라고도 하며 코드 인젝션의 기법 중 하나
클라이언트의 입력값 조작을 통해 서버의 Database를 공격하는 방식

로그인 쿼리가 아래와 같다고 했을때

select * from member

where id = ' " + id + " ' and "

+ "password = ' " + password + " ';"

 

아이디를 bunny' or 1 = 1 #

비밀번호를 1234

로 한다면

 

# 뒤는 주석 처리가 되어 항상 참이라는 결과를 받게 되어 로그인에 성공한다.

select * from member

where id = 'bunny' or 1 = 1 #' and "

+ "password = ' " + password + " ';"

 

 

SQL Injection 종류

Error Based SQL Injection
Union Based SQL Injection
Blind Based SQL Injection
Stored Procedure SGL Injection
Time Based SQL Injection
...

 

 

Error Based SQL Injection

Database에 고의적으로 오류를 발생 시켜 에러 출력을 통해
Database 구조를 파악하고 필요한 정보 습득

 

ex)

ERROR 2002
check the manual that
corresponds to youK(MySQL)
server version

 

실습)

Error Based SQL Injection

 

bWAPP (Buggy Web Application)
OWASP TOP 10 기반 취약접을 포함하여
모의해킹 테스트가 가능한 무료 오픈 소스인 취약한 웹 어플리케이션

 

위와 같이 영화 목록을 조회하고 검색할 수 있는 페이지에서 '을 넣으면 위와 같이 쿼리문이 작성이 되고

이 쿼리문은 SQL 내에서 문법 오류를 발생하여 공격자는 여기 서비스는 MySQL을 쓰는것을 알 수 있다.
이러한 공격 방법이 Error Based SQL Injection 이다.

 

 

Union Basd SQL Injection

 

Union Based는 기존의 쿼리 결과를 통해서 공격자가 임의로 얻고자 하는 조작 쿼리를 넣어
UNION 연산자를 사용하여 그것이 합쳐진 조회 결과를 받아볼 수 있다.

Union Based SQL Injection의 전제조건은 "컬럼의 개수가 같아야 한다"와 "데이터 형식이 같아야 한다"는 특징이 있다.

 

위와 같이 Union Based는 먼저 컬럼의 개수를 찾는 것부터 시작을 한다.
1를 넣었을 때 개수가 많지 않다는 메시지가 나오고 2를 넣었을 때도 마찬가지로 나온다.
숫자를 늘려서 7을 입력했을 때 위와 같이 결과를 받아볼 수 있다.
이것을 통해 공격자는 이 쿼리에 컬럼 결과값이 7개라는 것을 알 수 있고
이것을 통해 공격자는 추가로 공격할 수 있다.

 

버전이라는 함수를 사용해서 우분투 내 설치된 MySql 5.0.96 버전을 사용한다는 것을 알 수 있고
추가적으로 이러한 information_Schema.tables 라는 테이블을 통해 현재 어떤 테이블들이 저장돼 있는지 알 수 있다.


공격자가 만약에 users라는 테이블까지 보게 된다면 ID나 비밀번호가 노출되는 위험한 상황이 발생할 수 있다.

 

 

대응방안

1. 에러메시지 노출차단

 

2. 입력값 검증

1) SQL 쿼리문을 사용할 수 없게 입력값을 처음부터 제한

2) 특수문자 필터링

 

3. Prepared Statements


1) Statement는 SQL 쿼리문에 저희가 사용하는 데이터를 넣어서 쿼리문을 만들고 그 쿼리문을 통해 데이터베이스를

    조회하는 방식

 

2) Prepared Statement는 SQL 문을 먼저 데이터베이스에 준비한 뒤에 파라미터를 바인딩하는 방식으로 사용

    바인딩된 파라미터는 쿼리로서 동작할 수 없기 때문에 SQL Injection에 대한 대응 방법이라고 볼 수 있다.

 

 

 


그림으로 살펴보자면 인자값이 비어있는 쿼리가 데이터베이스에 준비가 되고 여기에 파라미터 데이터가 들어오게 되면 쿼리문이 실행되는 방식으로 사용되는 게 Prepared Statement 이다.

 

 

(참고)

JDBC Template은 공식 문서에서 나오는 걸로 봤을 때 Prepared Statement를 사용하는 방식으로 동작하고 있다.
그렇기 때문에 SQL Injection이 발생하지 않는다.

JPA는 공식 문서에 파라미터바인딩으로 동작하여 SQL Injection을 대응하고 있다

 

 

XSS(Cross Site Scripting)

- 악성 스크립트를 웹사이트에 주입하는 코드 인젝션 기법중에 하나

공격자가 웹 어플리케이션에 보낸 악성코드가 다른 사용자에게 전달될 때 발생

 

동작방식 


공격자가 서버에 악성 스크립트를 저장하고 사용자는 요청을 보낸다.
사용자는 이 리스폰스와 함께 악성스크립트를 받아서 이 사용자가 악성스크립트에 노출되는 방식을 XSS이라고 한다.

 


XSS 종류

  Stored XSS

  Reflected XSS

  DOM based XSS

 

 

Stored XSS

위에서 설명한 동작과정과 동일

예시)

위와 같이 블로그 글을 작성해서 블로그 글을 조회할 수 있는 간단한 블로그 서비스가 있다고 가정
블로그에 스크립트 문을 넣었는다면 글은 작성되지만 이것을 조회한 사용자는 본인의 쿠키값이 작성된 팝업 창을 볼 수 있다.

이러한 방법이 Stored XSS이다.

 

 

Reflected XSS

공격자가 사용자에게 스크립트를 보내고 사용자가 그 스크립트를 서버에 사용해서 공격에 노출되는 방식

 

 

예시)

공격자가 스크립트가 담긴 URL을 위와같이 가려서 숨길 수 있다.
이러한 정보를 속일 수 있는 메일에 담아서 보내게 되면 사용자는 의심없이 클릭하게 되고 이 스크립트가 실행되게 된다.
만약에 이 스크립트가 악성파일을 다운받는 사이트거나 쿠키나 세션 값을 전달하는 주소였다면 이 사용자에 대한 정보가 노출된다.
이러한 방식 Reflected XSS이다.

 


XSS 대응 방안

위 자료는 KISA 한국인터넷진흥원에서 제공하는 자료이다. 첫 번째로 위험문자를 인코딩하는 방식이 있다. 특수한 특수문자를 인코딩에서 사용할 수 없도록 만드는 방식이 있고 여기서 사용하는 데이터들을 검증하는 방식을 제공하고 있다. 하지만 공격 기법이 다양해지고 찾기 어려워지는 만큼 이런 라이브러리나 외부 솔루션을 사용하는 방법도 추천하고 있다.

 

 

(참고)

React는 모든 값을 랜더링하기 전에 이스케이프 치환한다.

 

즉, 위와 같이 특수문자를 자동으로 변환해서 사용하고 있다.
그렇기 때문에 React에서는 자동으로 XSS에 대응하고 있다고 보여진다.


참고

https://www.youtube.com/watch?v=laQAQeuuJF4&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC

728x90
반응형

댓글