웹 애플리케이션 취약점
--SQL Injection
DB 서버로 요청되는 정상 SQL 쿼리를 변조하거나 내용을 삽입하여 인증 절차 없이 DB에 접근 및 DB 사용자들을 피싱 사이트/악성코드 감염 사이트 등으로 유인하는 공격
① Form SQL injection: HTML 기반의 폼을 이용한 로그인을 사용하는 사이트가 취약한지 확인하기 위해 ‘ 와 같은 특수문자를 입력 값으로 하여 로그인 시도. 이때 에러 창이 뜬다면 해당 입력값이 서버단까지 전송되어 로그인 처리 중에 에러가 발생했다는 것이므로 사용자 입력 값에 대한 검증을 거치지 않는다는 사실을 확인 가능. 취약 사이트인 경우 조건절이 항상 참이 되도록 하는 값( ’ or 1=1#, ‘ or “1”=“1”#, ’ or “a”=“a”# 등_여기에서 #은 #뒤에 입력 값을 주석 처리해 해석하지 않도록 하는 것)을 입력하면 로그인에 성공할 수 있으며, 이때 불러오는 계정 정보는 정렬을 사용하여 로그인 계정을 조절할 수 있음.
>> 특수문자의 escape 처리(php 설정파일_php.ini에서 magic_quotes_gpc = ON으로 설정하면 특수문자(‘, “, /)를 일반문자로 치환하도록 할 수 있음, mysql_real_escape_string 함수 사용), 선처리 질의문 사용(사용자 입력값을 매개변수로 서버에 전달만 할 뿐, 사전에 정의된 질의문을 이용하므로 질의문 자체에는 변화가 없어 SQL 인젝션에 대응할 수 있음), 파라미터 필터링
② union SQL injection: SQL 문의 union(두 개의 쿼리 결과를 합해서 보여 주는 기능)을 사용하여 쿼리문을 삽입하는 공격으로, 두 쿼리 결과의 컬럼 수가 같아야 하며 데이터 타입도 같아야 함. 따라서 컬럼 개수 파악을 위해 select문(컬럼 수와 일치하는 숫자일 때 정상 출력됨)이나 order by문(컬럼 수가 초과하는 값일 때 오류 발생함)을 통해 컬럼의 수를 파악할 수 있음. 이를 통해 해당 테이블에 존재하는 모든 사용자의 정보를 알아내거나 관리자 계정으로 로그인할 수 있음.
③ stored procedure SQL injection: 프로시저란 일련의 쿼리를 하나의 함수처럼 실행하기 위한 쿼리의 집합으로, 확장 프로시저를 수행
>> mysql의 경우 master..xp_cmdshell, xp_startmail, xp_sendmail 등의 확장 프로시저는 운영체제 명령 실행, SQL 인젝션 등에 이용되므로 제거
④ mass SQL injection: 기존 SQL injection의 확장된 개념으로, 한 번의 공격으로 대량의 DB 값이 변조되어 홈페이지에 치명적인 영향을 미치는 공격
⑤ error based SQL injection: SQL 구문 입력 시 반환되는 에러 메시지를 기반으로 점진적으로 DB 정보를 획득하는 공격. 최근에는 웹 서버 보안 강화로 에러 값을 노출하는 경우가 많지 않아 과거에 자주 쓰이던 공격
⑥ blind SQL injection: DB 쿼리에 대한 오류 메시지가 아닌 쿼리 결과의 참과 거짓을 통해 의도하지 않은 SQL 쿼리문을 실행함으로써 데이터베이스를 비정상적으로 공격하는 기법
>> SQL injection 대응 방안: 데이터베이스와 연동하는 스크립트의 모든 파라미터를 점검하여 사용자의 입력 값에 SQL 쿼리문에 이용되는 특수문자 및 SQL 관련 문자열을 필터링, 입력되는 문자열의 길이 제한 및 숫자는 숫자인지 체크하는 함수 사용, 웹 애플리케이션이 사용하는 데이터베이스 사용자 권한 제거, 선처리 질의문 사용
--XSS(Cross Site Script)
웹 애플리케이션에서 사용자 입력값에 대한 필터링이 제대로 이루어지지 않을 경우, 공격자가 입력 가능한 폼(사용자 게시판/웹 브라우저 URL 등)을 통해 악의적인 스크립트를 삽입해 희생자 측에서 동작하도록 하는 공격
1) stored XSS: 취약한 웹 서버의 게시판 등에 웹서버의 DB에 악성 스크립트가 저장되도록 함. 게시물 중간에 iframe 태그(html 웹 문서 중간에 다른 웹문서나 메모장 등을 원하는 크기로 불러들여 보여 주는 태그) 등을 사용해 악의적인 자바 스크립트(ex_희생자의 쿠기 정보를 전달하도록 하는 스크립트 등)을 width, height를 0으로 하여 희생자에게는 보이지 않게끔 불러들여 스크립트를 실행시킴. 스크립트가 웹서버의 DB에 저장되고(웹 서버에 스크립트가 남음) 임의의 다수 사용자가 대상
2) reflected XSS: 외부에 있는 악성 스크립트가 희생자 액션에 의해 취약한 웹 서버로 전달되고 웹서버의 응답 페이지에 해당 악성 스크립트가 삽입되어 희생자 측에서 동작하는 방식. 즉 서버 측에서 동적 페이지를 구성하며, stored XSS와 다르게 웹 서버에 스크립트를 남기지 않고 특정 사용자를 대상으로 공격 수행.
3) DOM based XSS: DOM(Document Object Model_HTML 태그 트리 구조의 집합)을 통해 클라이언트 측에서 동적 페이지를 구성함.
>> XSS 대응 방법: 사용자 입력값은 반드시 서버 단에서 검증(클라이언트 측에서 검증 가능하나 웹 프락시 등을 통해 우회 가능하므로 서버 단에서의 검증 반드시 필요), 사용자 입력 문자열에서 HTML 코드로 인식될 수 있는 특수문자를 일반문자로 이스케이프 처리, 게시판에서 HTML 태그 허용해야 하는 경우에는 HTML 태그 화이트리스트를 통해 관리해야 함.
--CSRF(Cross Side Request Forgery)
웹 애플리케이션에서 정상 경로를 통한 요청과 비정상 경로를 통한 요청을 웹 서버가 구분하지 못할 경우 공격자가 스크립트 구문을 이용하여 정상적인 사용자로 하여금 조작된 요청을 전송하도록 하여 게시판 설정 변경, 회원 정보 변경 등의 문제가 발생할 수 있음. 이때 조작된 요청은 희생자의 권한으로 수행되기 때문에 희생자의 권한에 따라 피해 범위가 달라짐. CSRF 취약점이 발생할 수 있는 폼에 img 태그의 src 속성을 이용해 조작된 요청을 입력했을 때 요청이 실행되면 해당 공격에 취약한 것으로 판단.
>> 웹 애플리케이션에 존재하는 모든 HTTP 요청 내에 예측 불가능한 임의의 토큰을 추가해 정상적인 요청과 비정상 요청을 구분, XSS와 공격 방식이 유사하므로 XSS에 대한 취약점을 제거
--SSRF(Server Side Request Forgery)
적절한 검증 절차를 거치지 않은 사용자 입력 값을 서버 간의 요청에 사용하여 악의적인 행위가 발생하는 취약점. 공격자가 조작된 요청을 웹 서버에 전송하여 웹 서버가 내부 네트워크에 위치한 다른 서버에 악의적인 요청을 보내게 됨.
>> 사용자 입력 값을 다른 시스템의 서비스 호출에 사용하는 경우 사용자의 입력 값을 화이트리스트 방식으로 필터링하고 무작위 입력 값을 사용해야 한다면 블랙리스트 방식으로 필터링 수행, 동일한 내부 네트워크에 존재하는 서버 간이더라도 인증 및 서비스 접근 권한 등을 확인
**CSRF는 조작된 요청 발생 주체가 클라이언트, SSRF는 조작된 요청 발생 주체가 서버라는 점에서 다름
--운영체제 명령 실행
웹 애플리케이션에서 system(), exec()와 같은 시스템 명령어를 실행 가능한 함수를 제공하면서 사용자 입력 값에 대한 검증이 제대로 이루어지지 않는 경우, 사용자 입력 값이 운영체제의 명령어 일부/전체로 구성될 수 있고 의도하지 않은 시스템 명령어가 실행됨으로써 부적절하게 권한이 변경되거나, 공격자가 시스템 명령어를 호출할 수 있는 취약점. 이를 통해 공격자는 시스템 계정 정보 탈취, 백도어 설치, 관리자 권한 탈취 등을 수행할 수 있음.
>> 사용자 입력값(입력 파라미터)에 대해 운영체제 명령어를 실행할 수 있는 문자열(; && || | 등)을 필터링하거나 다른 문자로 치환하는 웹 애플리케이션 소스 파일을 직성하고 웹 방화벽 등 필터링이 가능한 보안 장비 사용 중이라면 룰셋(필터링 정책)을 수행, 웹 애플리케이션 운영 상 운영체제 명령어를 사용해야 한다면 허용 가능한 명령어 리스트를 통해 해당 명령어만 실행할 수 있도록 설정
--파일 업로드 공격
자료실, 게시판 등 파일 업로드가 가능한 페이지에 악의적인 실행 파일이 포함된 파일을 업로드하는 공격. 업로드하는 파일 타입이나 확장자를 체크하지 않고 업로드 허용하는 경우 웹쉘(악의적인 목적으로 웹 서버 내 임의의 명령을 실행할 수 있는 서버사이드 스크립트 파일로 확장자는 주로 php, asp, jsp)이 업로드 되어 서버에서 악의적인 명령이 수행되거나 악성코드 파일이 업로드 되어 이를 다운로드한 사용자가 침해사고를 당할 수 있음.
>> 업로드 파일의 확장자에 대한 검증 수행, 화이트리스트 정책 등을 통한 악성 스크립트 파일 업로드 차단, 업로드 파일 저장하기 위한 전용 디렉터리 별도 생성 후 웹 서버 설정을 통해 업로드 디렉터리에 있는 SSC 파일이 실행되지 않도록 설정하거나 URL 호출 차단, 업로드하는 파일의 개수 및 크기 제한
--HTTP 응답 분할 취약점
클라이언트 HTTP 요청에 포함되어 있는 요청 파라미터 값이 HTTP 응답 헤더에 포함되어 클라이언트에게 다시 전달될 때 파라미터 값에 개행문자인 CR(%0D_커서를 맨 앞으로)과 LF(%0A_커서를 다음 행으로)가 포함되어 있으면 HTTP 응답이 두 개로 분리될 수 있는데, 이때 공격자가 개행문자를 통해 첫 번째 응답은 종료시키고 두 번째 응답에 악의적인 코드를 포함시켜 XSS 등의 공격을 수행하는 것
>> 클라이언트 요청 파라미터 값이 서버 프로그램에서 쿠키로 사용되거나, 리다이렉션을 위해 응답 헤더로 사용되거나, 기타 응답 헤더 설정에 사용될 경우 HTTP 응답 분할이 발생하지 않도록 필터링
--XXE(XML eXternal Entity) 인젝션
취약한 XML 파서가 외부 개체를 참조하는 XML 데이터를 처리할 때 공격자가 삽입한 공격 구문이 포함된 외부 개체가 동작하여 서버 파일 접근, 불필요한 자원 사용, 인증 우회, 정보 노출 등이 발생할 수 있는 공격
**XXE를 통한 DoS 공격은 XXE 내의 하나의 개체가 다른 개체를 반복적으로 참조하도록 구성함으로써 해당 개체를 생성하는 과정에서 서버에 부하를 발생시키는 공격_XML Bomb 공격
>> 웹 애플리케이션에서 사용하는 XML 파서의 외부 개체 참조 기능을 사용하지 않도록 비활성화, XML 문서 내 외부 개체를 사용하지 못하도록 외부 개체를 선언하는 DTD(DOCETYPE 태그)를 필터링하거나 차단
--기타 공격
파일 다운로드 공격, 파일 삽입, 경로 추적, URL/파라미터 변조, 불충분한 세션 관리로 인한 취약점, 정보누출 취약점, XPath/XQuery 인젝션, 악성 컨텐츠 취약점, 불충분한 인증 및 인가 취약점, 취약한 패스워드 복구 취약점, 자동화 공격 취약점, 데이터 평문 전송 취약점, 쿠기 변조 등