1.웹 서비스 공격 개요
공격 유형은 사용자 컴퓨터 공격과 웹서버 공격으로 나뉜다.
웹서버에 대한 공격은 방화벽 필터링을 통과하여 내부 네트워크를 공격하는 시작점이므로 주의해야한다.
1) OWASP TOP10 (2021)
A01: Broken Access Control(취약한 접근 제어: 권한/인가)
A02: Cryptographic Failures(암호화 실패)
A03: Injection(인젝션)
A04: Insecure Design(안전하지 않은 설계)
A05: Security Misconfiguration (보안 설정 오류)
A06: Vulnerable and Outdated Components(취약하고 지원이 종료된 구성 요소)
A07: Identification and Authentication Failures(식별 및 인증 실패)
A08: Software and Data Integrity Failures(소프트웨어 및 데이터 무결성 오류)
A09: Security Logging and Monitoring Failures(보안 로깅 및 모니터링 오류)
A10: Server-Side Request Forgery(SSRF, 서버 측 요청 변조)
1.1) 취약한 접근 제어
인증된 사용자가 수행할 수 있는 작업에 대한 제한이 재대로 적용되지 않는 경우에 발생한다.
다른사용자의 중요한 파일을 보거나 데이터를 수정하고 접근 권한을 변경할 수 있다.
2. 주요 웹 어플리케이션 위협 및 대응책
1) SQL Injection
SQL Injection이란 구조화된 질의 언어를 사용자 입력 값에 악의적인 질의 언어를 주입하는 공격이다.
1.1) 취약점 진단 방법
로그인 필드에 큰따옴표("), 작은따옴표('), 세미콜론(;)을 입력하여 DB에러가 발생하는지 확인한다.
'or1=1--, 'or 'a'=a'a-- 와 같이SQL문이 결과적으로 참이될 수 있다면, SQL 삽입 공격에 사용될 수 있다.
1.2) SQL Injection 종류
① Form SQL Injection
HTML Form 기반 인증을 담당하는 어플리케이션의 취약점이 있는경우 사용자 인증을 위한 쿼리문의 조건을 임의로 조작하여 인증을 우회하는 방법이다.
공격 방법
terminating Query: ''and 1=1# and password=[ENC_DATA]
In-line Query: ''and 1=1 or '1'='1' and password=[ENC_DATA]
② Union SQL injection
union select 구문을 사용해 한 쿼리의 결과를 다른 쿼리의 결과에 결합하여 공격하는 기법이다.
UNION을 이용하여 mismatch를 발생시켜 Select 구문에 사용된 Field의 개수를 알아낼 수 있고 문자열 데이터의 경우 그 데이터를 알아낼 수 있다.
공격 방법
' union select 'admin, '1234'#
'%'and 1=2 union select null, null, null, null, concat(id,'/',pass),null,null from member#%'
③ Stored Procedure SQL injection
쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합을 의미한다.
공격 방법
;EXEC mater..xp_dirtree 'C:\'
④ Mass SQL injection
한번의 공격으로 대량의 DB 값이 변조되어 홈페이지에 치명적인 영향을 미치는 공격이다.
⑤ Blind SQL Injection
DB 쿼리에 대한 오류 메시지를 반환하지 않을경우 쿼리의 참과 거짓을 통해 의도하지 않은 SQL문을 실행함으로써 데이터베이스를 비정상적으로 공격하는 기법이다.
information_schma.tables
information_schma.columns
limit 0,1
substr (0,1)
1.3) 대응 방법
① 사용자 입력 값에 대한 검증을 수행한다.
② 특수문자를 일반문자로 치환한다.
php.ini 파일 내 magic_quotes_gpc = On
id=mysql_real_escape_string($id);
③ 쿼리 부분을 미리 컴파일 하여 생성한 후 반복적으로 입력값만을 매개변수로 바인드 할 뿐 질의문 자체는 영향 받지 않도록 설정
선처리 질의문(PreparedStatment)
④ 블랙리스트 기반의 필터링을 통해 실행 차단
파라미터 필터링
2) Cross Site Scripting(XSS)
사용자 입력값에 대한 재대로된 필터링이 수행되지 않을경우 공격자가 입력 가능한 폼에 악의적인 스크립트를 삽입하여 해당 스크립트가 클라이언트 측에서 실행 행위 없이 자동으로 동작하도록 하여 악의적인 행위를 수행하는 공격기법이다.
사용자 개인정보, 쿠키정보 탈취, 악성코드 감염, 웹 페이지 변조 등의 공격을 수행한다.
2.1) 개념
Stored XSS
사용자가 글을 저장할 수 있는 부분에 정상 평문이 아닌 스크립트 코드를 입력하는 기법이다.
DB에 악성 스크립트 구문이 저장된다.
Reflected XSS
스크립트 코드가 인자 형태로 포함된 URL을 클릭할 때 스크립트 코드가 취약한 웹서버로 전달되고 웹서버의 응답 페이지에서 해당 악성 스크립트가 삽입되어 희생자 측에서 동작하는방식
DB에 악성 스크립트가 저장되지 않는다.
DOM based XSS
클라이언트에서 자바스크립트가 DOM 객체를 생성할 때 악성 스크립트를 참조하여 생성함으로써 XSS 취약점이 발생한다.
2.2) 대응 방안
사용자가 입력한 문자열 검증을 서버단에서 수행한다.(<,>,& 등)
클라이언트 에서만 검증을 수행할 경우 Web Proxy툴을 이용하여 쉽게 우회가 가능하다.
HTML 코드로 인식될 수 있는 특수문자를 일반문자로 치환하여 처리하고 허용해야하는 경우에는 게시판에서 지원하는 HTML 태그 리스트를 선정한 후, 해당 태그만 허용하는 방식을 적용한다.
3) Cross Site Request Forgery (CSRF)
3.1) 개념
사용자가 인증한 세션이 특정 동작을 수행하여도 계속 유지되어 정상적인 요청과 비정상적인 요청을 구분하지 못하는점을 악용하여 공격한다.
3.2) 대응 방안
중요한 HTTP 요청에 대해서는 정상적인 요청과 비정상적인 요청을 판별할 수 있는 접근권한 정보가 포함된 토큰을 사용한다.
중요한 HTTP 요청에 대해서는 재인증을 유도한다.
XSS 취약점을 제거한다.
CSRF 토큰: 중요 페이지에 요청할 경우 요청을 식별할 수 있는 임의의 난수 값
// 로그인시, 또는 작업화면 요청시 CSRF 토큰을 생성하여 세션에 저장한다.
session.setAttribute("CSRF_TOKEN",UUID.randomUUID().toString());
// 요청 페이지에 CSRF 토큰을 셋팅하여 전송한다
<input type="hidden" name="_csrf" value="${CSRF_TOKEN}" />
4) SSRF(Server Side Request Forgery) 취약점
4.1) 개념
적절한 검증절차를 거치지 않은 사용자 입력값을 서버 간에 요청에 사용하여 악의적인 행위가 발생하는 취약점이다.공격자가 조작된 요청을 공개된 웹서버에 전송하여 웹서버가 내부 네트워크에 존재하는 다른 서버에 조작된 요청을 보내는 취약점이다.
4.2) 대응방안
사용자 입력값을 다른 시스템의 서비스 호출하는 경우 사용자의 입력값을 화이트 리스트 방식으로 필터링 하고 만약 범위가 넓다면 블랙 리스트 방식으로 필터링 한다.
내부 네트워크에 있는 서버 간이라도 기기인증, 서비스 접근권한 등을 확인하여 요청을 처리한다.
XSS와 CSRF의 차이점
클라이언트측에서 악성 스크립트가 동작한다는 방식에서 공격 방식을 동일 하나, XSS는 악의적인 행위(쿠키 정보 탈취, 악성 코드 다운로드)가 클라이언트에서 발생하고 CSRF는 악의적인 행위(서버의 개인정보 변경)가 서버에서 발생한다.
CSRF와 SSRF의 차이점
CSRF 공격자가 정상적인 사용자 클라이언트의 요청을 조작하여 웹서버에서 사용자의 권한으로 정보조작 등 악의적인 행위를 수행하는 취약점이고 SSRF는 공격자가 요청 정보를 조작하여 웹서버가 내부 서버에 조작된 요청을 하여 정보 탈취 등 악의적인 행위를 할 수 있는 취약점을 말한다.
5) 운영체제 명령어 실행 취약점(OS Command Injection)
5.1) 개념
사용자 입력 값을 받아 운영체제 명령어를 완성할 경우 해당 입력값에 악의적인 입력값을 넣을 경우 의도하지 않은 시스템 명령어가 실행될 수 있다.
웹 어플리케이션에서 시스템 명령을 실행할 수 있는 다양한 함수를 지원한다.
시스템 명령을 실행할 수 있는 PHP 함수: shell_exec(cmd), passthru(cmd), exec(cmd), system(cmd)
사용자가 IP주소 값을 입력할 경우 Ping 명령어를 전송해주는 서비스가 있는 경우 공격자가 IP 주소 입력 값에 192.168.1.100;cat /etc/passwd를 입력하여 /etc/passwd 값을 흭득할 수 있다.
명령1 && 명령2: 명령1의 결과가 참일 경우 명령2의 결과 실행
명령1 || 명령2: 명령1의 수행 결과가 거짓일 경우 명령2의 결과 실행
명령1 | 명령2: 명령1의 수행 결과를 명령2의 표준입력으로 전달
5.2) 대응 방안
입력값에 대해 운영체제 명령어를 실행할 수 있는 문자를필터링 수행하고 웹방화벽 등 필터링이 가능한 보안장비를 운영중이라면 룰셋(필터링 정책)을 적용한다.
운영체제 명령어를 사용해야 한다면 명령어 화이트리스트를 선정하여 해당 명령어만 실행할 수 있도록 설정한다.
6) 직접 객체 참조
파일, 디렉터리, 데이터베이스 키와 같이 내부적으로 구현된 객체에 대한 참조가 노출될 때 발생한다.
6.1) 디렉터리 탐색 공격 (Directory Traversal)
허가되지 않은 디렉터리나 파일의 경로를 이동하면서 접근하는 공격이다.
웹브라우저에서 확인 가능한 경로의 상위로 탐색하여 특정 시스템 파일을 다운로드한다.
6.2) 리버스 텔넷(리버스 쉘)
시스템에 텔넷과 같이 직접 명령을 입력하고 확인할 수 있는 쉘을 흭득하기 위한 방법으로, 방화벽이 존재하는 시스템을 공격할 때 자주 사용된다.
방화벽에서 In-Bound 정책에는 텔넷을 막는 경우가 많지만 Out-Bound는 별다른 필터링을 수행하지 않는 경우가 많아서 해당 허점을 이용한다.
6.3) 대응 방안
업로드 되어 저장되는 파일의 타입, 크기, 개수, 실행권한을 제한한다.
업로드 되어 저장되는 파일은 외부에서 식별 및 직접 경로로 탐색이 불가능해야한다.
파일 다운로드 요청시 요청파일명에 대한 검증 작업을 수행하고, 다운로드 시 무결성 검사를 수행한다.
7) 파일 업로드 취약점(File Upload Vulnerability)
7.1) 개념
업로드 하는 파일 타입, 확장자를 체크하지 않고 업로드 하는 경우 Webshell이 업로드 되어 서버에서 악의적인 명령이 수행되거나 악성코드 파일이 업로드 되어 이를 다운받은 사용자가 PC가 침해사고를 당할 수 있다.
업로드 하는 파일의 개수나 크기에 제한을 두지 않을 경우 공격자는 대량의 파일을 업로드하거나 큰 파일을 연속적으로 업로드 하여 서버의 가용성을 파괴시킬 수 있다.
웹쉘(Webshell): 악의적인 목적으로 웹서버 내 임의의 명령을 실행 할수 있는 Server Side Script 파일을 말한다.
MIME 타입
웹상에서 파일을 전송할 때 사용하는 표준 파일 형식으로 text, image, application 타입 등을 표현한다.
application/x-www-form-urlencoded: 일반적인 폼 데이터/파라미터 전송 시 사용
multipart/form-data: 일반적인 폼 데이터/파라미터와 파일 전송 시 사용
7.2) 대응 방안
① IIS에서 uploaded 등록 정보에서 실행 권한을 없음으로 설정한다.
② 업로드 파일 타입과 확장자에 대한 검증(화이트 리스트 정책)을 통해 악성 스크립트 업로드를 차단한다.
③ 업로드 파일을 저장하기 위한 전용 디렉터리를 별도 생성한 후 웹서버 설정을 통해 디렉터리에 있는 Server Side Script파일이 실행되지 않도록 설정 하거나 직접 URL 호출을 차단하도록 설정한다.
Config 파일: httpd.conf
<Directory "/var/www/html">
AllowOverride All
</Directory>
AllowOverride All: 하위디렉터리에서 엑세스 파일에 있는 모든 지시자 설정을 허용한다는 의미)
엑세스 파일: ./htacess
<FilesMatch "\.(ph|inc|lib)">
Order allow,deny
Deny from all
</FilesMatch>
AddType text/html .html . php .jsp .asp
FilesMatch: 파일 요청이 들어왔을 때 뒤에 있는 패턴과 일치하는지 확인
"\.(ph|inc|lib)": .ph, .inc, .lib 중 하나일 경우 (정규 표현식)
Order allow, deny: deny 정책을 수행한 후 allow 정책을 수행한다.
Deny from all: 모든 호스트로부터 요청을 거부한다.
AddType text/html .html . php .jsp .asp: 명시된 확장자들에 대해 text/html으로 MIME 타입을 재조정 하여 스크립트 파일이 아닌 HTML 문서로 처리하도록 한다.
④ 업로드 파일 개수나 크기에 대한 적절한 제한을 설정한다.
<Directory/>
Option FollowSymLinks
AllowOverride All
LimitRequestBody 50000000
</Directory>
<Directory "/var/www/html/home/download">
LimitRequestBody 50000000
</Directory>
LimitRequestBody: 파일 업로드 디렉터리에 업로드할 파일 크기를 제한
8) 파일 다운로드 취약점(File Download Vulnerability)
8.1) 개념
파일 다운로드 기능이 존재하는 웹 어플리케이션에서 파일 다운로드 시 파일의 경로 및 파일명을 파라미터로 받아 처리하는 경우 이를 적절히 필터링하지 않으면 공격자가 이를 조작하여(경로 및 파일 조작) 허용되지 않은 파일을 다운 받을 수 있는 취약점이다.
8.2) 대응 방안
사용자가 입력하는 파일경로와 이름에 대해 허용하는 경로 이외의 디렉터리와 파일에 접근할 수 없도록 설정한다.
상대 경로를 지정할 수 있는 문자(../)를 블랙리스트 방식으로 필터링 한 후 경고 메시지를 출력한다.
WAF에 필터링 정책을 적용한다.
9) 파일 삽입 취약점(File Inclusiom Vulnerability)
9.1) 개념
공격자가 악성 서버 스크립트를 서버에 전달하여 해당 페이지를 통해 악성 코드가 실행되도록 하는 취약점을 말한다.
LFI(Local File Inclusion): 악성파일이 로컬에 위치한 파일 삽입 취약점
RFI(Remote File Inclusion): 악성파일이 원격에 위치한 파일 삽입 취약점
include(),require() 함수를 이용한 경우
include,require 함수는 지정한 파일을 현재 페이지에 포함시켜 실행시켜주는 함수이다. require() 함수는 스크립트가 문제에 있어도 무시하고 실행하고 require() 함수는 스크립트에 문제가 있다면 중단한다.
파일/페이지 정보를 외부로부터 입력받을 때 적절한 검증을 수행하지 않는다면 악성스크립트가 포함된 페이지가 include될 수 있다.
if(iseet($_GET['submit'])){
$target=$_REQUEST['fname'];
include($target);
}
9.2) 대응 방안
파일명: php.ini
allow_url_fopen 옵션은 PHP에서 include, require 함수를 이용하여 외부파일을 URL 형식으로 읽어올 수 있도록 하는 기능으로 RFI 공격에 취약하기 때문에 사용하지 않도록 설정한다.
allow_url_fopen = Off
에러 메시지를 출력하지 않기 위해 display_errors 옵션을 Off로 설정한다.
httpd.conf파일의 경우 ErrorDocument 지시자를 이용하여 각 에러코드별로 에러 페이지를 출력한다.
display_errors = Off
10) 불충분한 세션 관리 취약점
10.1) 개념
사용자가 로그인을 할 경우 동일한 세션ID를 발급 하거나 세션 타임아웃을 너무 길게 설정할 경우 공격자가 다른 사용자의 세션을 재사용하여 해당 사용자의 권한을 탈취하는 취약점이다.
10.2) 대응 방안
세션 ID는 로그인 시 마다 추측할 수 없도록 랜덤한 값으로 새롭게 발급한다.
파일명: php.ini
세션 타임아웃을 설정한다.
session.gc_maxlifetime = 600
스크립트를 통해 쿠키를 실행 시킬 수 없도록 httponly 속성을 설정한다.
session.cookie_httponly = 1
https 통신일때만 쿠키 정보를 전달할 수 있도록 secure 속성을 설정한다.
session.cookie_secure = 1
Response 값에 있는 Set-Cookie 속성에 secure; HttpOnly;속성이 추가된다.
11) HTTP 응답 분할 취약점
11.1) 개념
HTTP 요청 파라미터 값이 응답 헤더에 포함되어 클라이언트에게 다시 전달 될 때 파라미터 값에 개행 문자가 있을 경우 HTTP응답이 2개 이상으로 분리될 수 있다.
첫번째 응답 메시지에 Content-Length를 0으로 처리한 뒤 개행문자를 넣고 두번째 응답 메시지에 공격자가 악의적인 스크립트를 삽입한다.
개행 문자 표기: CR LF
URL Encoding: %0D%OA
11.2) 대응 방안
클라이언트 요청 파라미터 값이 서버 프로그램에서 쿠키로 사용되거나 리다이렉션을 위해 Loaction 응답 헤더로 사용 될 경우 HTTP 응답 분할 취약점이 발생하지 않도록 필터링하여 사용한다.
12) XXE(XML eXternal Entity) Injection 취약점
12.1) 개념
취약한 설정이 가진 XML 파서가 외부개체를 참조하는 XML 페이지를 처리할 때 공격자가 삽입한 공격 구문이 포함된 외부 개체가 동작하여 서버 파일 접근, 불필요한 자원 사용, 인증 우회, 정보 노출 등이 발생할 수 있는 취약점이다.
XML DTD: XML 문서의 구조 문서에서 사용 가능한 요소, 속성, 개체 등을 정의한다.
개체(!ENTITY): 문서 내부, 또는 외부에 개체 정의한다.
외부 개체의 경우 SYSTEM 키워드를 사용하여 외부에 있는 자원(파일, URL)을 가져와 정의한다.
공격자가 intro 외부 개체를 통해 중요한 파일 또는 내부 URL에 접근할 수 있고 하나의 개체가 다른 개체를 반복적으로 참조하도록 구성하여 해당 개체를 생성하는 과정에서 서버에 부하를 발생 시키는 도스 공격을 수행할 수 있다.
<!-- 정상 구문 -->
<!DOTYPE BLOG[
<!ELEMENT BLOG (NAME.INTRO)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT INTRO (#PCDATA)>
<!--<!ENTITY intro "피망 IT 블로그(www.peemangit.tistory.com)"> 내부 개체-->
<!ENTITY intro SYSTEM "file///var/www/html/home/intro.txt">
]>
<BLOG>
<INTRO>&intro</INTRO>
</BLOG>
<!-- 공격 구문 1 (파일경로를 통한 외부 개체 정의 악용, XXE LFI Inclusion)-->
<!DOTYPE BLOG[
<!ENTITY intro SYSTEM "file///etc/passwd">
]>
<BLOG>
<INTRO>&intro</INTRO>
</BLOG>
<!-- 공격 구문 2 (URL을 통한 외부 개체 정의 악용, XXE RFI Inclusion)-->
<!DOTYPE BLOG[
<!ENTITY intro SYSTEM "http://peemangit.tistory.com/home/secrect.txt">
]>
<BLOG>
<INTRO>&intro</INTRO>
</BLOG>
<!-- 공격 구문 3 (외부 개체 통한 DoS 공격, XML Bomb)-->
<!DOTYPE BLOG[
<!ENTITY intro "intro">
<!ENTITY intro2 "&intro;&intro;&intro;&intro;&intro;&intro;">
<!ENTITY intro3 "&intro2;&intro2;&intro2;&intro2;&intro2;&intro2;">
]>
<BLOG>
<INTRO>&intro</INTRO>
</BLOG>
12.2) 대응 방안
XML 파서의 외부 개체 참조 기능을 사용하지 않도록 비활성화 한다.
if(function_exists('libxml_disable_entity_loader')){
libxml_disable_entity_loader(true);
}
13) Xpath/XQuery Injection 취약점
13.1) 개념
Xpath 또는 Xquery (XML)질의문에 대한 필터링이 재대로 이뤄지지 않을 경우 공격자가 입력가능한 폼에 조작된 질의어를 입력하여 인증 우회를 통해 인가되지 않은 데이터를 열람할 수 있는 취약점이다.
13.2) 대응 방안
Xpath 또는 Xquery 에 사용되는 외부 입력 데이터에 대한 특수문자, 쿼리 예약문 필터링을 수행한다.
스트링을 연결하는 형태로 구성하지 않고 인자화된 쿼리문을 사용한다.
15) 쿠키 변조
15.1) 개념
사용자 인증시 쿠키를 사용하게 될 경우 공격자가 이를 변조하여 다른 사용자로 전환하거나 권한 상승이 가능한 취약점이다.
쿠키를 클라이언트측에 정보가 저장되고 매 요청시마다 쿠키 헤더에 담아서 전달하기 때문에 스니핑에 취약하다.
15.2) 대응 방안
쿠키 방식 대신 세션 방식을 사용하는 것을 권장한다.
3. 개발 보안 안내서
① 사용자에게 전달된 값을 재사용하는 경우 조작이 가능하기 때문에 신뢰해서는 안된다.
② 스크립트를 사용하여 클라이언트에서 입력값을 검증하는 것은 쉽게 우회될 수 있기 때문에 최종 통제 매커니즘은 반드시 서버에서 수행되어야 한다.
③ 개발 과정에서 작성된 주석 등 클라이언트에게 중요 정보를 전달하지 않는다.
④ GET으로 전송 시 URL에 그대로 노출되기 때문에 중요 정보 전송 시 POST 메소드 또는 SSL(HTTPS)를 사용한다.
⑤ 중요한 트랜젝션이 일어나는 프로세스에 CSRF공격을 수행하지 않기 위해 사용자의 비밀번호를 재확인한다.
⑥ 중요 정보를 보여주는 페이지는 로그아웃 한 뒤 뒤로가기를 눌러 해당 페이지를 확인할 수 있기 때문에 캐쉬를 사용하지 못하도록 설정한다.
<meta HTTP-EQUIV="Pragma" CONTENT="no-cache"> <!-- HTTP 1.0 -->
<meta HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <!-- HTTP 1.1 -->
4. 기타 보안 분석 방법
블랙박스 테스트: 소프트웨어의 내부를 보지 않고 입력 값과 출력 값만 확인하여 기능의 유효성을 판단하는 테스트이다.
화이트박스 테스트: 응용 프로그램의 내부 구조와 동작을 검사하는 소프트웨어 테스트이다.
정적분석
소프트웨어를 실행하지 않고 소스코드 수준으로 보안약점 분석
개발 과정에서 주로 사용
개발 초기에 보안 약점 발견으로 수정비용이 절감된다.
설계 구조 관점의 보안약점은 발견할 수 없다.
동적분석
소프트웨어 실행환경에서 보안약점 분석
시험단계에서 주로 사용
소스코드가 필요없다구조 관점의 보안약점은 발견할 수 없다.
[참조]
CSRF: https://sj602.github.io/2018/07/14/what-is-CSRF/
'Certification Study > 정보보안기사' 카테고리의 다른 글
[정보보안기사] 웹서버 보안 (0) | 2022.10.28 |
---|---|
[정보보안기사] HTTP 개념 (0) | 2022.10.19 |
[정보보안기사] 네트워크 개념 (4) | 2022.10.13 |
[정보보안기사] 접근통제 보안위협 및 대응책 (0) | 2022.10.12 |
[정보보안기사] 윈도우 서버 보안 (0) | 2022.10.12 |
공부&일상 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 질문은 언제나 환영입니다😊