일본IT외노자생활

보안 관련 용어 정리 본문

IT/보안

보안 관련 용어 정리

VEGAS 2022. 6. 29. 09:45

XSS(Cross-site Scripting)

SQL injection과 함께 웹 상에서 가장 기초적인 취약점 공격 방법의 일종으로,

악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법

공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며,

보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취한다.

출처:NordVPN

XSS 공격 방식으로는 쿠키 스니핑(Cookie Sniffing), 스크립트 암호화 및 우회, 악성 스크립트 유포, 키 로거(Key Logger), 마우스 스니퍼(Mouse Sniffer), 거짓 정보 추가 등이 있습니다.

XSS 공격은 주로 스크립트 언어와 취약한 코드를 대상으로 합니다.

주요 XSS 공격의 세 가지 유형은 다음과 같습니다.

1. Reflected XSS (반사형 XSS 공격)

가장 일반적인 유형의 XSS 공격으로 사용자에게 입력 받은 값을 서버에서 되돌려주는 곳에서 발생합니다.

이러한 유형의 XSS 공격은 피해자에게 입력 받은 검색어를 그대로 표시하는 곳이나 피해자가 입력한 값을 오류 메시지와 함께 보여주는 곳에 악성 스크립트를 삽입하며, 스크립트는 서버가 피해자의 입력 값을 포함해 응답을 전송할 때 실행됩니다.

반사형 XSS 공격은 피해자가 직접 스크립트를 실행하도록 유도하기 때문에 1회성 공격이라고 할 수 있습니다. 해커가 주입한 악성 스크립트는 해당 서버를 반사해 오류 메시지나 검색 결과를 통해 피해자의 화면에 표시될 수 있습니다.

악성 스크립트는 링크를 클릭한 사용자의 쿠키 값을 해커에게 전송하도록 설정되어 있습니다. 사용자는 버튼 또는 링크를 클릭함으로써 악성 스크립트를 실행하게 되며, 이 경우 악성 스크립트에 감염된 웹사이트에 입력한 모든 정보가 노출됩니다.

2. Reflected XSS (영구적 XSS 공격)

영구적 XSS 공격은 저장형 XSS 공격이라고도 하며, 응용 프로그램이나 웹사이트의 모든 HTTP 응답을 감염시키는 공격을 의미합니다.

영구적 XSS 공격은 반사형 XSS 공격과 달리 지속적으로 피해를 입히는 공격 유형입니다.

영구적 XSS 공격은 해커는 웹 애플리케이션에서 XSS 취약점을 파악하고, 악성 스크립트를 삽입하는 방식으로 진행됩니다.

삽입된 스크립트는 데이터베이스에 저장이 되고, 악성 스크립트가 존재하는 게시글 등을 열람한 사용자들은 쿠키를 탈취당하거나 다른 사이트로 리디렉션되는 공격을 받게 됩니다.

악성 스크립트가 데이터베이스에 저장되어 지속적으로 공격을 실시하기 때문에 많은 피해가 발생할 수 있다는 것이 영구적 XSS 공격의 특징입니다.

영구적 XSS 공격이 가장 많이 발생하는 곳은 게시판이며, 게시판 외에도 사용자가 입력한 값이 데이터베이스에 저장이 되고 저장된 값이 그대로 프론트엔드에 표시되는 곳에서 공격이 발생할 가능성이 높습니다.

일반적으로 XSS 공격은 사용자의 입력 값을 검증하지 않기 때문에 발생한다고 할 수 있습니다.

영구적 XSS가 위험한 이유는 사용자가 링크를 클릭하도록 유인할 필요가 없다는 것입니다.

해커가 할 일은 피해자가 악성 코드가 삽입된 웹사이트에 접속하기만을 기다리는 것뿐입니다.

3. DOM 기반 XSS

웹페이지를 여는 즉시 생성되는 문서 객체 모델(Document Object Model, DOM)은 사용자가 서버와 상호 작용하지 않고도 페이지의 모든 콘텐츠에 액세스할 수 있도록 돕는 프로그래밍 인터페이스입니다.

DOM 기반 XSS 공격은 피해자의 브라우저에 초점을 맞춘 것이 특징인 공격입니다.

반사형 및 영구적 XSS는 응답 페이지 HTML에서 악성코드가 분명하게 나타나기 때문에 위험 징후를 발견할 수 있지만, DOM 기반 XSS는 웹사이트의 코드를 조사하지 않고는 취약점을 발견할 수 없습니다.

이 때문에 전문 기술 지식을 갖추지 않은 이상 DOM 기반 XSS 공격에 당하기 쉽습니다.

웹사이트를 클릭하기 전 코드를 확인하는 사람은 많지 않기 때문입니다.

 

방지법

1. URL을 확인하는 습관

2. 악성 스크립트 확인

3. 사용자가 입력한 값과 사용자가 입력한 값을 그대로 출력할 때 검증이 실시되고 있는지 확인

4. Chrome, Safari 등의 브라우저에는 반사형 XSS를 탐지하는 기능 내장

 


SQL injection

SQL 인젝션(SQL 삽입, SQL 주입으로도 불린다)은 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말한다. 주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생한다.

공격의 쉬운 난이도에 비해 파괴력이 어마어마하기 때문에 시큐어 코딩을 하는 개발자라면 가장 먼저 배우게 되는 내용이다.

이러한 injection 계열의 취약점들은 테스트를 통해 발견하기는 힘들지만 스캐닝툴이나 코드 검증절차를 거치면 보통 쉽게 발견되기 때문에 탐지하기는 쉬운 편이다.

보안회사 Imperva가 2012년에 발표한 보고서에 따르면 월평균 4회가량의 SQL 인젝션 공격이 일어난다고 한다. 

OWASP에서도 수년 동안 인젝션 기법이 보안 위협 1순위로 분류되었던 만큼 보안에 각별한 주의가 필요하다. 너무나도 잘 알려진 취약점 공격이기 때문에 대부분의 서버는 SQL 인젝션에 대한 방어가 되어있다. 

괜히 애먼 곳에서 이 공격을 시도하지 말자. 

공격이 먹히지도 않고 본인의 IP만 차단당할 것이며, 설령 먹힌다 해도 법률에 따라 처벌받는다.


공격 방법

SELECT user FROM user_table WHERE id='admin' AND password=' ' OR '1' = '1';

password=' '를 만듦과 동시에 SQL 구문 뒤에 OR '1' = '1'을 붙였다. 

WHERE 뒤에 있는 구문을 간단히 축약하면 false AND false OR true로 정리할 수 있는데, 논리학에 따르면 AND 연산은 OR보다 연산 우선순위가 빠르기 때문에 해당 구문의 연산 값은 true가 되어 올바른 값으로 판단하고 실행하게 된다. 

즉, 아이디와 비밀번호를 몰라도  OR '1' = '1' 구문 때문에 로그인에 성공하게 되는 것이다.

로그인뿐만 아니라 JOIN이나 UNION 같은 구문을 통해 공격자가 원하는 코드를 실행할 수도 있다.


로그인 폼도 결국엔 서버에 요청을 해서 받는 것이다. 

HTTP 헤더를 보면 응답 헤더에 서버의 종류와 버전이 나온다. 

Apache 서버는 MySQL 서버, IIS는 MS SQL 같은 방식으로 데이터베이스의 종류를 추측할 수 있다. 

DB엔진을 알아내서 해당 시스템에 맞는 명령어를 이용해 데이터를 뽑아내거나 할 수 있다.


방어 방법

아마도 XSS와 상당 부분 겹치겠지만 기본적으로 유저에게 받은 값을 직접 SQL로 넘기면 안 된다.

요즘에 쓰이는 거의 모든 데이터베이스 엔진은 유저 입력이 의도치 않은 동작을 하는 걸 방지하는 escape 함수와 prepared statement를 제공한다. prepared statement 는 변수를 문자열로 바꾸는 것이라 안전하다.

또한 DB에 유저별로 접근 권한과 사용 가능한 명령어를 설정하면 최악의 경우에 SQL injection에 성공하였다고 하더라도 그나마 피해를 최소화할 수 있다.

SQL injection은 데이터베이스 스키마를 알아야 가능한 공격기법이라고 하지만 스키마 구조를 몰라도 SQL injection을 사용하면 스키마 구조를 알아낼 수가 있다.

그리고 데이터베이스를 변조하려는 게 아니라 파괴하려는 거라면 와일드카드 문자( * )를 사용해서 그냥 싹 다 지워버리는 공격이 가능.

DBMS 마다 문법이 다르기 때문에 개발자가 그걸 다 고려해서 코딩하는 방법은 매우 비추천한다. 

해당 언어나 프레임워크에서 제공하는 prepared statement라는 방법을 사용하는 게 최선. 

escape_string 같은 함수를 사용하면 몇몇 군데에서 빼먹거나 하는 실수로 보안 구멍이 생길 수 있다. 

그리고 prepared statement는 사용 전에 일부 컴파일돼서 DB 쿼리를 가속시켜주므로 적극적으로 사용하자. 다만 컴파일하는 시간이 있다 보니 변수만 다른 같은 쿼리를 반복적으로 하는 작업에서야 유의미한 속도 향상이 있다. 프로시저(Procedure)라는 쿼리 캡슐화 기능도 쓰면 좋다.

추천되는 방어법은 클라이언트 측의 입력을 받을 웹 사이트에서 자바스크립트로 폼 입력값을 한 번 검증하고, 서버 측은 클라이언트 측의 자바스크립트 필터가 없다고 가정하고 한 번 더 입력값을 필터한다.

이때 정규표현식등으로 한번 걸러내고, SQL 쿼리로 넘길 때 해당 파라미터를 prepared statement로 입력받고 이를 프로시저로 처리하는게 좋다.

다음, 쿼리의 출력값을 한 번 더 필터하고(XSS 공격 방어의 목적이 강하다) 유저에게 전송한다.

이렇게 하면 해당 폼에 대해서는 SQL injection 공격이 완전히 차단된다.

물론 이것이 공격 기법의 전부가 아니므로 정보 유출에 민감한 사이트를 운영할 생각이라면 보안 회사의 컨설팅을 꼭 받아야 한다.


OWASP Top10 (2021.9)

1. Broken Access Control

 

2. Cryptographic Failures

 

3. Injection

 

4. Insecure Design

 

5. Security Misconfiguration

 

6. Vulnerable and Outdated Components

 

7. Identification and Authentication Failures

 

8. Software and Data Integrity Failures 

 

9. Security Logging and Monitoring Failures

 

10. Server-Side Request Forgery


참고하면 좋은 사이트

XSS

https://noirstar.tistory.com/266

 

XSS(Cross-Site Scripting) 이란?

2. XSS (Cross-Site Scripting)  2.1 개요 Ÿ   XSS Attack  XSS(Cross-Site Scripting) 이란 웹 애플리케이션에서 일어나는 취약점으로 관리자가 아닌 권한이 없는 사용자가 웹 사이트에 스크립트를 삽입하..

noirstar.tistory.com

https://nordvpn.com/ko/blog/xss-attack/

 

크로스 사이트 스크립팅의 정의 및 공격 유형

크로스 사이트 스크립팅(XSS)은 피해자가 친숙하게 생각하는 사이트에 해커가 악성 스크립트를 주입하는 행위를 말합니다. 크로스 사이트 스크립팅이라는 용어의 의미와 공격 사례, 반사형 XSS,

nordvpn.com

SQL injection

블라인드 SQL 인젝션

https://lucete1230-cyberpolice.tistory.com/94

 

[Bee-box] Blind SQL 인젝션 - Boolean Based

이번 포스팅은 Blind SQL인젝션 Boolean Based 방법 입니다. 실습하는 모든 공격은 실제로 사용하시면 안됩니다. 허용받지 않은 서비스 대상에 해킹을 시도하는 행동은 금지하며, 모든 법적 책임은 사

lucete1230-cyberpolice.tistory.com

https://noirstar.tistory.com/264

 

SQL Injection 이란? (SQL 삽입 공격)

1. SQL Injection  1.1 개요 Ÿ   SQL Injection SQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작

noirstar.tistory.com

 

Comments