본문 바로가기

카테고리 없음

정보보안기사 애플리케이션보안(2)

1. SQL Injection 취약점
: 웹 애플리케이션에서 입력 받아 DB로 전달하는 정상적인 SQL 쿼리를 변조, 삽입하여 불법 로그인, DB데이터열람, 시스템명령 실행 등을 수행하여 비정상적인 DB 접근을 시도하는 공격 기법
: 조작한 입력으로 DB를 인증 절차 없이 접근 및 자료를 무단 유출, 변조
: MySQL => ~ where id =' ' or 1=1#
MsSQL => ~ where id =' ' or 1=1--
Oracle => ~ where id = ' ' or 1=1--


1) Union SQL Injection
: 2개 이상의 SELECT문을 결합하고자 할 때 사용, SELECT문의 필드 개수가 같아야 하며, 필드 타입이 호환 가능해야 한다.
: 한 쿼리의 결과를 다른 쿼리의 결과에 결합하여 공격하는 기법

* 컬럼 개수 파악 방법
: ORDER BY절로 컬럼의 인덱스 지정을 통해 지정 인덱스 컬럼이 없으면 오류 발생함을 이용
: UNION SELECT문이 컬럼 개수가 맞지 않으면 오류가 발생함을 이용


2) Stored procedure SQL Injection
: 일런의 쿼리를 하나의 함수처럼 실행하기 위한 쿼리의 집합
: 공격자는 no 파라미터에 값과 함께 세미콜론(;) 문자를 통해 명령어 연속 수행 시킴


3) Mass SQL Injection
: 대량의 DB값이 변조되어 홈페이지에 치명적 영향을 미치는 공격
: 변조된 내용으로 악성 스크립트를 삽입하여 사용자가 변조된 사이트 방문 시 감염, 악성Bot 설치 => 테이블의 컬럼 데이터에 악성코드 유포지의 URL로 변조하여 접속 유도, 유포


4) Error-Based SQL Injection
: DB 쿼리에 대한 에러값을 기반으로 한 단계씩 점진적으로 DB 정보를 획득할 수 있는 방법
: 외부로 에러 노출되는 취약점을 이용한 공격
: 테이블, 컬럼 정보, 버전 정보 획득 등


5) Blind SQL Injection
: 쿼리 결과의 참과 거짓을 통해 의도하지 않은 SQL문을 실행함으로써 DB를 비정상적으로 공격
* infomation_schema : DB에 대한 메타데이터를 제공하는 스키마
information_schema.tables : DB에 있는 모든 테이블 정보를 가지고 있는 테이블
information_schema.columns : DB에 있는 모든 테이블의 컬럼 정보를 가지고 있는 테이블
: limit와 substr를 이용하여 테이블명을 선택, 테이블명, 컬럼명 등을 한 문자로 나누어 반복적 대입의 참과 거짓 결과를 통해 테이블 이름, 컬럼명, 데이터를 추측하여 알아냄
: select * from free_board where subject like '%' and substr((select column_name from information_schema.columns where table_name = 'download' limit 0,1),1,1)='a'#%'
=> %입력값% 0개 이상의 임의의 문자를 의미


- 대응책
ㄱ. php.ini (PHP 설정파일)의 magic_quotes_gpc = On (PHP 5.4버전 미만)
: Get, Post, Cookie로 전달되는 데이터에서 ', ", \, Null 문자 등 특수문자를 일반문자 치환
특수문자의 이스케이프 처리
ㄴ. ymsql_real_escape_string($id or $pass) 함수를 통해 특수문자 이스케이프 처리
ㄷ. Prepared Statement(선처리 질의문)
: 외부로부터의 입력값을 제외한 쿼리 부분을 미리 컴파일 한 후, 입력 값만을 바인드해서 실행하는 방식으로 문자열로 변환된 입력값에 의해 영향을 받지 않으므로 SQL 인젝션 방 어하는 효과
ㄹ. 사용자 입력값 검증을 통한 불필요한 문자열의 입력 방지
ㅁ. 웹 애플리케이션이 사용하는 DB 사용자 권한 제한
ㅂ. 입력되는 문자열의 길이 제한
////////////////////////////////
10진수 HEX
/         2F
/////////////////////////////////

2. XSS(Cross Site Script)
: 웹 애플리케이션에서 사용자 입력값에 대한 필터링이 제대로 이루어지지 않아 공격자가 입력이 가능한 폼(웹 브라우저 URL 또는 게시판 등)에 악의적인 스크립트를 삽입, 해당 스크립트가 희생자 측에서 동작하여 악의적인 행위를 수행하는 취약점
: 사용자의 개인정보 및 쿠키정보 탈취, 악성코드 감염, 웹 페이지 변조 등의 공격 수행


1) Stored XSS
: 공격자가 취약한 웹 서버에 악성 스크립트를 저장, 희생자가 해당 자료를 요청하여 삽입된 악성 스크립트 응답 페이지가 전달되어 클라이언트 측에서 동작
: 태그를 이용하여 자바 스크립트를 실행하는 형태가 일반적


2) Reflected XSS
: 외부에 있는 악성 스크립트가 희생자 액션에 의해 취약한 웹 서버로 전달되고, 웹 서버의 응답 페이지에 해당 악성 스크립트가 삽입되어 희생자 측에서 동작하는 방식
: Stored XSS 악성 스크립트가 취약한 웹 서버의 DB에 저장되어 있는 형태임에 반하여, 이는 저장되는 것이 아니고 악성 스크립트가 포함된 요청 정보를 처리하는 과정에서 악성 스크립트가 포함된 응답 페이지가 생성되어 희생자에게 전달되는 방식
: 링크 클릭시 취약한 웹 서버로 id 파라미터에 악성 스크립트를 포함한 GET 요청 메시지가 전달
: 취약점 발생할 수 있는 입력 가능한 폼, URL 파라미터 등에 스크립트 삽입, 동작 시 취약 판단
=> , 입력 시 팝업창 발생여부


- 대응책
ㄱ. 사용자 입력값에 대한 검증
: htmlspecialchars() 함수는 html 문법상 특수문자의 기능 제거, 일반 문자로 치환
: <, > &it;, &gt; / &, &amp; / ", ' &quot;. &#039;
: 사용자 입력값에 대한 검증은 '서버'에서 해야한다. => 클라이언트 단에서 수행시 우회가능
ㄴ. 이스케이프 처리
: 사용자 입력 문자열에서 HTML 코드로 인식될 수 있는 특수문자를 일반문자로 치환
ㄷ. HTML 태그 제한
: HTML 태그를 허용해야하는 경우라면 화이트 리스트 기반 태그 허용


3. CSRF(Cross Site Request Forgery)
: 공격자가 스크립트 구문을 이용하여 정상적인 사용자로 하여금 조작된 요청을 하도록하여 게시판, 회원정보 변경 등의 문제가 발생할 수 있는 취약점
: HTTP 요청을 통해 희생자 모르게 공격자의 의도된 행위를 수행하게 하는 특징
: 사용자의 권한을 공격자가 그대로 사용하게 되므로 피해범위가 다양
: 취약점 발생할 수 있는 입력 가능한 폼에 img 태그의 src 속성을 이용하여 조작된 요청 입력, 요실행시 취약 판단 =>


- 대응책
ㄱ. 모든 HTTP 요청 내에 예측할 수 없는 임의의 토큰을 추가하여 정상적인 요청과 비정상 요청을 판별하는 것을 권장
* 위조된 요청 여부를 확인하기 위해 사용자 접근권한 정보를 포함한 '토큰'을 이용 세션정보에 포함된 토큰 값과 요청에 포함된 토큰 값을 비교한다.
* 중요 기능에 대해선 세션 검증 및 재인증 유도
ㄴ. XSS와 공격 방식이 유사하므로 XSS 취약점 제거 필요


4. 운영체제 명령어 실행 취약점
: 웹 애플리케이션에서 system(), exec()와 같은 시스템 명령어 함수를 제공하거나 사용자 입력값 필터링이 제대로 이루어지지 않을 경우 공격자가 시스템 명령어 호출
: ip ping 테스트 결과 페이지에 ';'붙여 추가 명령어 삽입, 호출 ping 127.0.0.1; cat /etc/passwd
=> ; 순차/ && 참의 연속수행/ || 거짓의 연속수행/ | 1의 결과를 2의 표준입력으로


- 대응책
ㄱ. 사용자 입력값 필터링
ㄴ. 화이트 리스트 기반의 허용 가능 운영체제 명령어 선정


5. 파일 업로드 취약점
: 업로드 기능이 존재하는 웹 애플리케이션에서 확장자 필터링이 이루어지지 않을 경우 공격자가 악성 스크립트 파일(웹쉘)을 업로드하여 원격에서 시스템 제어할 수 있는 취약점
* 웹쉘 : 악의적으로 웹 서버에 업로드 및 설치된 후 원격으로 웹 인터페이스를 통해 실행되어 대상 시스템의 정보 유출, 변조, 시스템 명령 실행, 원격 제어 등을 수행하는 서버 사이드 스크립트


- 대응책
ㄱ. 업로드 파일명 확장자에 대한 필터링
ㄴ. 업로드 파일을 저장하기 위한 전용 디렉터리 생성 후, 실행권한 제거


6. 파일 다운로드 취약점
: 파일 다운로드 기능이 존재하는 웹 애플리케이션에서 파일의 경로 및 파일명을 파라미터로 받아 처리 하는 경우 필터링을 하지 않으면 공격자가 조작하여 허용되지 않는 파일을 다운받을 수 있음
* 디렉토리 트레버셜(Directory Traversal): 허가되지 않은 디렉토리, 파일의 경로로 접근


- 대응책
ㄱ. 외부 입력하는 파일 경로와 이름에 대해 허용하는 경로 이외의 디렉토리와 파일에 접근 제한
ㄴ. 외부 입력값에 대해 파일 경로를 변경할 수 있는 문자열(../ , ..\)에 대해 필터링


7. 불충분한 세션 관리 취약점
: 웹 애플리케이션에서 사용자가 로그인을 할 경우 매번 동일한 세션ID 또는 세션 타임아웃을 길게 설정하였을 경우 공격자가 이를 재사용하여 해당 사용자의 권한 탈취할 수 있는 취약점
: 세션 ID를 탈취 => 로그인(HTTP 세션 하이재킹)


- 대응책
ㄱ. php.ini 설정파일(타임아웃, HTTPS 통신 쿠키 설정)
: sessin.gc.amxlifetime, session.cookie_httponly = 1 or true, session.cookie_secure = 1 or true
ㄴ. 세션ID는 매번 추측할 수 없는 랜덤한 값으로 발급
ㄷ. 세션 타임아웃을 통한 자동 로그아웃


8. 정보누출 취약점
: 민감한 정보가 개발자의 부주의로 인해 노출, 중요정보를 주석 구문에 포함시켜 의도하지 않게 정보가 노출되거나 에러 페이지 또는 에러 메시지를 통해 불필요한 정보가 노출되는 취약점


- 대응책
ㄱ. php.ini 환경설정
: display_errors = off 설정 "ErrorDocument 403 /home/security/error_page.php"
: ErrorDocument 지시자를 이용한 에러코드별 에러페이지 생성


9. 준수 권장하는 개발 보안안내
1) 사용자에게 전달된 값(파라미터, Form 필드)을 재사용할 경우 신뢰해서는 안된다.
2) 최종 통제 메커니즘은 반드시 서버에서 수행
3) 클라이언트에게 중요 정보 전달 금지(하드코딩X), 쿠키암호화
4) 중요 정보 전송 시 POST 메서드 및 SSL 적용
5) 중요 트랜젝션이 일어나는 프로세스에 사용자의 비밀번호 재확인
6) 중요 정보를 보여주는 페이지는 캐쉬를 사용하지 않는다.