[Hot Issue] 웹 애플리케이션 10가지 위험 요소와 예방법
OWASP Top 10 2010 1부
OWASP(Open Web Application Security Project)에서는 웹 애플리케이션 환경에서 가장 중요한 위협 10가지를 선정하여 발표하고 있다. 안철수연구소 ASEC Report에서는 OWASP Top 10에 대해 총 3회에 걸쳐 소개할 예정이다. 이를 통해 고객들이 웹 애플리케이션 보안의 취약점을 인지하고 예방할 수 있기를 기대한다.
이번 호에는 OWASP Top 10 개요와 가장 위험한 요소로 꼽고 있는 인젝션(Injection)에 대해 집중 소개한다.
악성코드 제작자들은 더 이상 OS 취약점만은 노리지 않는다. 그들은 복잡해지는 시스템과 새로운 기술의 등장에 발맞추어 더 매력적인 대상을 물색 중이다. 최근 이들이 가장 매력적으로 느끼고 있는 것이 바로 웹 애플리케이션이다. OWASP가 발표하는 Top이 ‘가장 일반적인 취약점 상위 10가지’가 아닌 지금 현재 ‘가장 위험하다고 여기지는 위험 상위 10가지’라는 점이 중요하다. 따라서 관리자 입장에서 이를 인지하고 방어하는 것이 필요하다.
OWASP Top 10 2010 vs. OWASP Top 10 2007
OWASP Top 10은 웹 애플리케이션 취약점에 대해 부정기적으로 발표된다. 이번 OWASP Top 10 2010은 지난 2007년 버전 발표 후 3년 만에 발표된 것이다.
우선 먼저 2007 버전에 비해 2010 버전을 어떻게 달라졌는지 살펴보자.
[표 1]에서 확인할 수 있듯이 기존 버전과 달라진 점은 ‘악성 파일 실행’, ‘정보 유출과 부적절한 오류 처리’ 항목이 삭제되었고, ‘보안상 잘못된 구성’, ‘검증되지 않은 리다이렉트와 포워드’가 추가됐다는 것이다.
|
OWASP Top 10 2010 |
OWASP Top 10 2007 |
|
A1 – 인젝션 (Injection) |
A2 – 인젝션 취약점 |
|
A2 – 크로스 사이트 스크립팅 (XSS) |
A1 – 크로스 사이트 스크립팅 (XSS) |
|
A3 – 취약한 인증과 세션 관리 |
A7 – 취약한 인증 및 세션 관리 |
|
A4 – 안전하지 않은 직접 객체 참조 |
A4 – 불안전한 직접 객체 참조 |
|
A5 – 크로스 사이트 요청 변조 (CSRF) |
A5 – 크로스 사이트 요청 변조 (CSRF) |
|
A6 – 보안상 잘못된 구성 (신규) |
|
|
A7 – 안전하지 않은 암호 저장 |
A8 – 불안정한 암호화 저장 |
|
A8 – URL 접근 제한 실패 |
A10 – URL 접속통제 실패 |
|
A9 – 불충분한 전송 계층 보호 |
A9 – 불안전한 통신 |
|
A10 – 검증되지 않은 리다이렉트와 포워드(신규) |
|
|
|
A3 – 악성파일 실행 |
|
|
A6 – 정보 유출과 부적절한 오류 처리 |
출처: Security Plus
OWASP Top 10 2010 위험과 예방 방법
이제 본격적으로, OWASP가 2010년에 발표한 웹 애플리케이션 10가지 위험과 이에 대한 예방 방법에 대해 알아보자.
|
OWASP Top 10 2010 |
위험 |
예방법 |
|
A1 – 인젝션 (Injection) |
n SQL, OS, LDAP 인젝션과 같은 인젝션 결함은 신뢰할 수 없는 데이터가 명령어나 질의어의 일부분으로써 인터프리터(interpreter)에 보내 질 때 발생한다. n 공격자의 악의적인 데이터는 예기치 않은 명령 실행이나 권한 없는 데이터에 접근하도록 인터프리터 (interpreter)를 속일 수 있다. |
n 인젝션을 방지하려면 신뢰할 수 없는 데이터를 명령어와 질의로부터 항상 분리해야 한다. |
|
A2 – 크로스 사이트 스크립팅 (XSS) |
n XSS 결함은 적절한 확인이나 제한 없이 애플리케이션이 신뢰할 수 없는 데이터를 갖고, 그것을 웹 브라우저에 보낼 때 발생한다. n XSS는 공격자가 피해자의 브라우저 내에서 스크립트의 실행을 허용함으로써, 사용자의 세션을 탈취하거나, 웹사이트를 변조하거나, 악의적인 사이트로 사용자를 리다이렉트 할 수 있다. |
n XSS를 방지하려면 활성 브라우저 콘텐츠와 신뢰할 수 없는 데이터를 항상 분리해야 한다 |
|
A3 – 취약한 인증과 세션 관리 |
n 인증과 세션 관리와 연관된 애플리케이션 기능은 종종 올바로 구현되지 않는다. 그 결과, 공격자로 하여금 다른 사용자의 신분으로 가장할 수 있도록 패스워드, 키, 세션 토큰 체계를 위태롭게 하거나, 구현된 다른 결함들을 악용할 수 있도록 허용한다. |
n 개발자들은 아래와 같은 권장사항을 준수하여야 한다. . 강력한 인증 및 세션 관리 통제의 단일체계를 유지해야 한다. . 세션 ID를 도용하는데 사용될 수 있는 XSS 취약점을 막기 위해 노력해야 한다. |
|
A4 – 안전하지 않은 직접 객체 참조 |
n 직접 객체 참조는 파일, 디렉터리, 데이터베이스 키와 같이 내부적으로 구현된 객체에 대해 개발자가 참조를 노출할 때 발생한다. n 접근 통제에 의한 확인이나 다른 보호가 없다면, 공격자는 이 참조를 권한 없는 데이터에 접근하기 위해 조작할 수 있다. |
n 사용자 혹은 세션 당 간접 객체 참조를 이용한다. n 신뢰할 수 없는 소스로부터 직접 객체 참조가 사용되면, 각각의 사용에 대해 요청한 객체가 사용자에게 접근이 허용되었는지 확인하기 위해서 반드시 접근 통제 확인을 포함해야만 한다. |
|
A5 – 크로스 사이트 요청 변조 (CSRF) |
n CSRF 공격은 로그온 된 피해자의 브라우저가 취약한 웹 애플리케이션에 피해자의 세션 쿠키와 어떤 다른 자동으로 포함된 인증 정보를 갖고 변조된 HTTP 요청을 보내도록 강제한다. n 이것은 공격자가 피해자의 브라우저로 하여금 취약한 애플리케이션이 피해자로부터의 정당한 요청이라고 착각하게 만드는 요청들을 생성하도록 강제하는 것을 허용한다. |
n CSRF를 예방하는 방법은 각각의 HTTP 요청 URL이나 Body 내에 예측할 수 없는 토큰을 포함하는 것이다. 생성된 토큰은 최소한 사용자 세션 별로 반드시 고유 값을 사용하되, 각각의 요청마다 고유할 수도 있다. |
|
A6 – 보안상 잘못된 구성 (신규) |
n 훌륭한 보안은 애플리케이션, 프레임워크, 애플리케이션 서버, 웹 서버, 데이터베이스 서버와 플랫폼에 대해 보안 구성이 제대로 정의되고 적용되도록 용구 한다. n 대부분이 보안을 기본적으로 탑재하지 않기 때문에 이 모든 설정은 정의되고, 구현되고, 유지되어야 한다. 이것은 애플리케이션에서 사용되는 모든 코드 라이브러리를 포함하여 모든 소프트웨어가 최신의 상태를 유지하는 것을 포함한다. |
n 적절히 보호되는 또 다른 환경 구축을 쉽고 빠르게 만들 수 있는 반복 가능한 보안 강화 프로세스는 개발, 품질 보증, 생산 환경 모두에서 동일하게 구성되어야 한다. n 모든 새로운 소프트웨어 업데이트와 패치를 각각의 배치환경에서 시기 적절하게 배포와 최신 수준을 유지하기 위한 프로세스가 있어야 한다. |
|
A7 – 안전하지 않은 암호 저장 |
n 많은 웹 애플리케이션들이 적절한 암호나 해쉬를 갖고 신용카드 번호, 주민등록번호, 그리고 인증 신뢰 정보와 같은 민감한 데이터를 적절히 보호하지 않는다. n 공격자는 자격 도난, 신용카드 사기, 또는 다른 범죄를 저지르기 위해 적절하지 못하게 보호된 데이터를 훔치거나 조작할 수 있다. |
n 민감한 데이터를 보호하려고 하는 위협(예, 내부자 또는 외부 사용자의 공격)을 고려해야 한다. n 위협으로부터 방어하기 위한 방법으로, 모든 민감한 데이터가 암호화 하였음을 확실히 해야 한다. |
|
A8 – URL 접근 제한 실패 |
n 많은 웹 애플리케이션들이 보호된 링크나 버튼을 표현하기 전에 URL 접근 권한을 확인하다. 그러나, 애플리케이션은 이 페이지들이 접근될 때마다 유사한 접근 통제 확인이 필요하다 n 공격자는 감춰진 페이지에 접근하기 위해 URL을 변조할 수 있다. |
n 허가되지 않은 URL 접근을 방지하기 위해 각각의 페이지에 적절한 인증 및 접근 제어를 요구하는 접근 방식의 선택이 요구된다. 애플리케이션 코드 외부의 하나 또는 여러 컴포넌트에서 이러한 보호를 제공한다. |
|
A9 – 불충분한 전송 계층 보호 |
n 애플리케이션은 종종 민감한 네트워크 트래픽의 인증, 암호화, 그리고 비밀성과 무결성을 보호하는데 실패한다. n 실패할 때에는 대체로 약한 알고리즘을 사용하거나, 만료 또는 유효하지 않은 인증서를 사용하거나 또는 그것을 올바로 사용하지 않을 때이다. |
n 모든 민감한 페이지는 SSL을 요구하라. 이 페이지에 대한 non-SSL 요청은 SSL페이지로 리다이렉트 되어야 한다. n 모든 민감한 쿠키는 ‘secure’ 플래그를 설정하라. n 단지 강력한 알고리즘(FIPS 140-2 호환)만을 지원하는 SSL 공급업체를 구성하라. |
|
A10 – 검증되지 않은 리다이렉트와 포워드(신규) |
n 웹 애플리케이션은 종종 사용자들을 다른 페이지로 리다이렉트 하거나 포워드 한다. 그러나, 목적 페이지를 결정하기 위해 신뢰되지 않는 데이터를 사용한다. n 적절한 확인이 없다면, 공격자는 피해자를 피싱 사이트나 악의적인 사이트로 리다이렉트 할 수 있고, 포워드를 권한 없는 페이지의 접근을 위해 사용할 수 있다. |
n 단순히 리다이렉트와 포워드의 사용을 피해야 한다. n 만약 사용한다면, 목적지를 계산하는 사용자 파라미터를 포함하지 마라. n 목적 파라미터를 피할 수 없다면, 제공된 값이 유효한지, 그 사용자에게 허용된 것인지를 확실히 하라. |
OWASP Top 2010 _ A1 인젝션
앞서 살펴보았던 OWASP 2010 Top10 중 인젝션(Injection) 공격에 대해 좀더 자세히 알아보자.
먼저 인젝션 공격의 주요 사항은 다음의 그림을 통해 알 수 있다.
[그림] 취약한 버전의 퀵타임 플레이어에 의해 다운로드 된 악성코드
■ 주요 내용
Threat Agents(공격자): 내,외부 사용자, 관리자를 포함하여 시스템에 신뢰할 수 없는 데이터를 보낼 수 있는 사람들을 말한다.
Attack Vectors(공격경로): 공격자는 목표가 된 인터프리터 구문을 악용하는 간단한 텍스트 기반의 공격을 전송한다. 거의 모든 데이터의 소스는 내부 소스를 포함해서 인젝션 공격을 위한 경로로 활용될 수 있다. 따라서 인젝션은 공격으로 악용되기가 쉽다(Exploitability EASY).
Security Weakness(보안 취약점): 인젝션 결함은 어플리케이션이 인터프리터로 신뢰할 수 없는 데이터를 보낼 때 발생한다. 인젝션 결함은 매우 일반적이며, SQL 질의, LDAP 질의, XPath 질의, OS명령어, 프로그램 인수 등에서 자주 발견된다. 코드 검증을 하면 인젝션 결함은 발견하기 쉽지만, 테스트를 통해서 발견하기는 어렵다. 스캐너와 Fuzzer는 공격자가 인젝션 결함을 발견하는데 도움이 될 수 있다.
따라서, 보안 취약점의 알려진 정도는 보통(Prevalence COMMON)이고, 탐지 용이도 보통(Detectability AVERAGE)인 것으로 조사되었다.
Technical Impacts(기술적 영향): 인젝션의 공격의 결과는 데이터 손실과 파괴, 책임 추적성 결여, 또는 서비스 거부가 될 수 있다. 때로는 인젝션으로 호스트가 완전히 장악 당할 수도 있다. 따라서, 비즈니스 영향도는 심각(Impact SEVERE)한 수준이다.
Business Impacts(비즈니스 영향): 영향을 받는 데이터와 인터프리터를 운영하는 플랫폼의 비즈니스적 가치를 고려해야 된다. 모든 데이터가 도둑 맞거나, 조작되거나, 또는 삭제 되었을 때 당신의 명성이 훼손 될 수 있다는 점을 유의하기 바란다.
■ 인젝션 공격 예
이 어플리케이션은 아래와 같이 취약한 SQL 호출문을 작성할 때 신뢰할 수 없는 데이터를 사용한다.
String query=”SELEC * FROM accounts WHERE custID=” +request.getParameter(“id”)+””;
공격자는 브라우저에서 ‘id’ 변수를 ‘ or’1’=’1로 변경한다. 그 결과 이 질의는 해당 고객 계정 데이터베이스만 반환하라는 의미 대신에, 계정 데이터베이스로부터 모든 레코드를 반환하라는 의미로 변경된다.
http://example.com/app/accountview?id=’or’1’=’1
최악의 경우, 공격자는 이 취약점을 이용해 데이터베이스의 Stored Procedure를 호출해 데이터베이스 호스트를 전면 장악할 수 있다.
■ 대응책
인젝션을 방지하려면 신뢰할 수 없는 데이터를 명령어와 질의로부터 항상 분리해야 한다.
선호되는 방법으로는 ▲ 인터프리터 사용을 전면 금지 ▲ 변수화된 인터페이스를 제공하는 안전한 API를 사용 ▲ 특히 Stored Procedures와 같이 변수화 되었지만 인젝션을 유발 할 수 있는 API 사용시 주의 등이 있다.
단, 단수화된 API를 사용할 수 없는 경우에는 인터프리터용 Escape 구분을 사용해 특수 문자를 신중하게 처리해야 한다.
지금까지 OWASP Top 10 2010 중 인젝션에 대해 알아보았다. 아래는 관련 참조자료로 많은 활용 바란다. 다음 호에서는 크로스사이트 스크립팅, 취약한 인증과 세션 관리 등에 대해서 자세히 소개하고자 한다.
[참고자료]
• OWASP (www.owasp.org)
• Security Plus (http://cafe.naver.com/securityplus/)
• OWASP SQL Injection Prevention Cheat Sheet
•OWASP Injection Flaws Article
•ESAPI Encoder API
•ESAPI Input Validation API
•ASVS: Output Encoding/Escaping Requirements (V6)
•OWASP Testing Guide: Chapter on SQL Injection Testing
•OWASP Code Review Guide: Chapter on SQL Injection
•OWASP Code Review Guide: Command Injection
External
•CWE Entry 77 on Command Injection
•CWE Entry 89 on SQL Injection
- 안철수연구소