[정보보안] 웹 애플리케이션 취약점 공격의 대응방안 총정리
SQL Injection 취약점은 SQL을 사용하는 웹 애플리케이션에서 S/W개발자가 생각하지 못한 입력 및 조작으로 인해 발생하는 오류로서, 해커는 이를 악용하여 인증우회, 정보유출, 시스템 장애 등의 다양한 공격이 가능합니다. “2023년 CWE가 발표한 가장 위험한 소프트웨어 취약점 25” 글과 함께 보시면 좋습니다.
- 사용자 입력값은 반드시 서버 단에서 검증하여 악의적인 행위를 발생시키는 스크립트가 웹 프록시 등의 도구를 통해 우회하여 입력되는 것을 방지한다
- 사용자 입력값에서 SQL 질의문에 이용되는 특수문자(‘, : , ; , -- , # 등)나 SQL 예약어를 필터링한다
- 입력되는 문자열의 길이를 제한하고 숫자일 경우 숫자인지 체크하는 함수를 사용한다
- 웹 애플리케이션이 사용하는 데이터베이스 사용자의 권한은 최소한으로 제한한다
- Prepared Statement 객체를 적용하여 입력값을 제외한 질의문을 사전 컴파일하고, 실행 시 입력값을 바인딩시킴으로써 악의적인 입력값에 의한 질의문의 구조변경을 차단한다
XSS 취약점은 해커가 홈페이지 게시판, 전자메일 등에 악의적인 스크립트를 숨겨놓고, 이용자가 해당 게시물 또는 메일을 클릭하였을 때 클라이언트 측에서 악성 스크립트가 실행되어 로그인정보나 개인정보, 내부자료 등을 탈취하는 공격이 가능합니다.
- 사용자 입력값은 반드시 서버 단에서 검증하여 악의적인 행위를 발생시키는 스크립트가 웹 프록시 등의 도구를 통해 우회하여 입력되는 것을 방지한다
- 사용자가 입력한 문자열에서 HTML 코드로 인식될 수 있는 특수문자(< , > , ” , ‘ , & 등)가 있는 경우 저장하지 못하게 하거나, 특수문자를 HTML Entity로 치환한다
- 게시판 등에서 HTML 태그 허용 시 허용할 태그 리스트를 선정한 후 해당 태그만 허용하는 방식을 적용한다
- HTTP Cookie 속성 중 HttpOnly를 설정하면 자바스크립트에서 쿠키에 접근할 수 없으므로 쿠키 탈취를 위한 XSS 취약점 공격에 대응 가능하다
CSRF 취약점은 사용자가 인증된 상태에서 공격자가 악의적인 요청을 사용자가 자신의 의지와는 무관하게 브라우저를 통해 웹 서버에 전달하여 정상적인 사용자의 권한으로 공격자가 의도한 행위(수정, 삭제, 등록, 송금 등)을 하게 만드는 공격이 가능하다. XSS는 악의적인 행위가 클라이언트(웹 브라우저)에서 발생하지만, CSRF는 서버에서 발생한다는 차이점이 있다.
- 서버는 각 요청에 대해 고유한 CSRF 토큰을 생성하고, 클라이언트 측에서 이 토큰을 포함한 요청을 보내면, 서버는 이 토큰의 유효성을 검사하여 정상적인 요청인지 비정상적인 요청인지 판별합니다.
- 중요한 기능에 대해서는 사용자 세션 검증과 재인증을 유도한다
- XSS 취약점을 이용한 공격 방식과 유사하므로 XSS 취약점을 제거합니다.
SSRF 취약점은 적절한 검증 절차를 거치지 않은 사용자 입력 값을 서버 간(웹서버와 내부 서버)의 요청에 사용하여 접근통제를 우회하는 방식으로 내부 시스템 스캔, 내부 정보 탈취 등의 악의적인 행위가 가능하다
- 사용자의 입력값을 다른 시스템의 서비스 호출에 사용하는 경우, 사용자의 입력값을 화이트 리스트 방식으로 필터링한다
- 무작위의 입력값을 사용해야 한다면 블랙 리스트 필터링 방식으로 필터링한다
- 동일한 내부 네트워크에 있는 서버 간이라도 기기 인증, 서비스 접근 권한 등을 확인하여 요청을 처리한다
OS Command Injection 취약점은 웹 애플리케이션에서 사용자 입력값으로 시스템 명령어를 실행할 수 있는 함수를 제공하는 경우, 사용자 입력값에 대한 필터링이 제대로 이루어지지 않아 시스템 계정 정보 유출, 백도어 설치, 관리자 권한 탈취 등의 공격이 가능하다
(Perl의 system 함수, PHP의 exec/shell_exec/passthru/system 함수, JSP의 eval 함수, ASP의 eval 함수 등)
- 사용자 입력값에 대해 운영체계 명령어를 실행할 수 있는 문자열(; , && , || , | 등)을 필터링하여 차단 또는 제거한다
- 허용할 수 있는 명령어의 화이트 리스트를 작성/적용하여 해당 명령어만 실행할 수 있도록 설정한다
File Upload 취약점은 게시판, 자료실 등에 파일 업로드가 가능한 경우 악성 스크립트 파일(웹셀)을 업로드한 후에 Server Side Interpreter 특성을 이용하여 업로드된 파일을 실행하는 공격이 가능하다.
- 업로드 파일에 대한 파일타입 및 확장자 검증(화이트 리스트 정책)을 통해 악성 스크립트 파일 업로드를 차단한다
- 업로드하는 파일의 개수나 크기에 적절한 제한을 설정한다(
LimitRequestBody 지시자
) - 업로드 파일을 저장하기 위한 전용 디렉터리를 별도 생성한 후 웹 서버 설정을 통해 업로드 디렉터리에 있는 서버 사이드 스크립트 파일이 실행되지 않도록 설정(
AddType 지시자
)하거나 직접 URL 호출을 차단하도록 설정(FileMatch 지시자
)한다$ vi .htaccess <FilesMatch "\.(ph|inc|lib)"> Order Allow, Deny Deny from all </FileMatch> AddType text/html .html .htm .txt .php .php3 .php4 .phtml .phps .in .cgi .pl .jsp .shtml
File Download 취약점은 웹 애플리케이션에서 파일의 경로 및 파일명을 입력받아 사용자가 파일을 다운로드할 때, 이를 적절히 필터링하지 않으면 공격자가 이를 조작하여 허용하지 않은 중요한 파일을 다운받는 공격이 가능하다
- 외부에서 입력하는 파일 경로와 이름에 대해 허용 경로 이외의 디렉터리와 파일에 접근할 수 없도록 처리한다(
ChrootDir 지시자
를 사용하여 웹 애플리케이션 루트 디렉터리를 최상위 디렉터리로 변경하여, 시스템 루트 디렉터리로 접근하지 못하도록 설정한다) - 외부 입력값에 대해 파일 경로를 변경할 수 있는 문자열(..\, ../ 등)과 인코딩 문자열을 필터링하도록 웹 애플리케이션을 작성한다
- 웹방화벽 등 필터링이 가능한 보안장비를 운영 중이라면 필터링 정책을 적용한다
Directory Traversal 취약점은 파일 또는 디렉터리 접근이 통제되지 않아 웹서버 또는 웹 애플리케이션의 중요한 파일과 데이터에 대한 접근 및 실행이 허용되어 공격자가 중요한 파일에 접근하거나 서버의 비밀 정보를 탈취하는 공격이 가능하다.
- 사용자가 임의로 접근할 수 있는 최상위 디렉터리를 웹 애플리케이션 루트 디렉터리로 설정(
ChrootDir 지시자
) 사용) - 외부 입력값에 대해 파일 경로를 변경할 수 있는 문자열(..\, ../ 등) 및 인코딩 문자열을 필터링하도록 웹 애플리케이션을 작성한다
- 웹방화벽 등 필터링이 가능한 보안장비를 운영 중이라면 필터링 정책을 적용한다
- 취약한 버전의 웹서버 및 웹 애플리케이션 서버는 최신 버전으로 업데이트를 적용한다
File Inclusion 취약점은 웹 애플리케이션에서 외부 파일(로컬/원격)을 불러오는 기능을 제공할 때, 공격자가 이 취약점을 이용하여 원하지 않는 파일을 포함시켜서 다양한 악성 행위를 수행할 수 있습니다. PHP의 경우, include()나 require() 함수를 사용하여 외부 파일을 불러올 수 있습니다.
- 소스코드에 include, require 등의 구문/함수가 존재하는지 검증하고 만약 사용자의 입력값을 통해 파일명이 결정된다면 외부의 악의적인 파일이 포함되어 실행되지 않도록 PHP 설정 파일일 php.ini 파일에
allow_url_fopen = Off
를 설정한다
URL/Parameter 변조 취약점은 사용자 입력값에 대한 검증 누락이 발생하는 모든 상황을 포함하고 있으므로, 공격자는 SQL Injection, XSS 취약점 공격에 활용할 수 있습니다.
- 웹 애플리케이션이 제공하는 정보와 기능을 역할에 따라 배분함으로써(권한 관리) 사용자가 변경할 수 있는 데이터의 노출을 최소화한다
- 파라미터 변조 여부를 검증하는 과정이 필요하며 중요한 정보가 있는 페이지는 재인증을 적용한다
불충분한 세션 관리 취약점은 웹 애플리케이션에서 사용자가 로그인할 때 생성되는 세션 ID가 추측 가능하거나(동일/반복/일정한 룰), 세션 타임아웃을 너무 길게 설정하였을 경우, 공격자가 HTTP 세션 하이재킹과 같은 방법으로 사용자 세션을 탈취하여 공격에 활용할 수 있다.
- 세션 ID는 로그인 시마다 추측할 수 없는 랜덤한 값으로 새롭게 발급한다
- 세션 타임아웃 설정 등을 통해 일정 시간 요청이 없으면 자동 로그아웃되도록 구현한다(
Timeout/RequestReadTimeout/KeepAliveTimeout 지시자
)
HTTP Response Splitting 취약점은 사용자가 HTTP 요청에 삽입된 입력값이 HTTP 응답 헤더에 포함되어 사용자에게 다시 전달되는 경우에, 공격자가 입력값에 개행문자인 CRLF(%0D%0A)를 연속해서 포함시키면 HTTP 응답이 2개로 분리되어 공격자가 첫 번째 응답을 종료시키고 두 번째 응답에 악의적인 코드를 주입하여 XSS 공격 등이 가능해진다
- 클라이언트 요청 파라미터(입력값)가 서버 프로그램에서 응답헤더 설정에 사용될 경우, HTTP 응답 분할이 발생하지 않도록 적절히 필터링한다
– 쿠키 설정을 위해 Set-Cookie 응답 헤더로 사용되거나, 리다이렉션을 위해 Location 응답헤더로 사용는 경우 등
XXE(XML eXternal Entity) Injection 취약점은 취약한 XML 파서가 외부 개체를 참조하는 XML 데이터를 처리하는 경우, 공격자가 삽입한 공격 구문이 포함된 외부 개체가 동작하여 서버 파일 접근, 불필요한 자원 사용(XML Bomb 공격), 인증 우회, 정보 노출 등이 발생시킬 수 있다.
- 웹 애플리케이션이 사용하는 XML 파서의 외부 개체 참조 기능을 사용하지 않도록 비활성화한다
- XML 문서 내 외부 개체를 사용하지 못하도록 외부 개체를 선언하는 DTD(DOCTYPE 태그)를 필터링한다
XPath/XQuery Injection 취약점은 데이터베이스와 연동된 웹 애플리케이션에서 XPath나 XQuery 질의문에 대한 필터링이 제대로 이루어지지 않으면, 공격자가 입력이 가능한 폼에 조작된 질의문을 삽입하여 인증 우회를 통해 인가되지 않은 데이터를 열람하는데 악용될 수 있다.
- XPath, XQuery에 사용되는 외부 입력값에 대하여 특수문자 및 질의 예약어에 대한 필터링을 수행한다.
- 스트링을 연결하는 형태로 구현하지 않고 인자화된 질의문을 사용한다