All posts

공부/정보보안기사

CSRF(Cross Site Request Forgery)

정상적인 경로를 통한 요청과 비정상 요청을 서버가 구분하지 못할 경우, 공격자가 스크립트 구문을 이용하여 정상적인 사용자가 조작된 요청을 전송하도록 하는 기법

 

ex) 조작된 요청 정보를 게시글에 포함하여 희생자가 조회하면서 비정상적인 요청을 서버에 요청함.

 

대응방안

* HTTP 요청 내에 예측할 수 없는 임의의 토큰을 추가하여 정상적인 요청과 비정상적인 요청을 구분.

* XSS의 공격 방식과 유사함으로 XSS에 대한 취약점을 제거하는 것을 권장

크로스 사이트 스크립트(XSS)

공격자가 입력 가능한 폼에 악의적인 스크립트를 삽입하여 희생자 측에서 실행되도록 하여 개인정보 및 쿠키 정보 취득

 

Stored XSS

게시판 등의 입력폼을 통해 악성스크립트를 DB에 저장하여 희생자가 요청할 때 클라이언트 측에서 실행되는 방식

 

* 특수문자를 Escape 처리

htmlspecialchars()

 

Reflected XSS

외부의 악성 스크립트가 희생자 액션에 의해 취약한 웹서버로 전달. 응답 페이지에 악성 스크립트를 삽입하는 방식

 

DOM based XSS

희생자의 웹 브라우저에서 응답 페이지에 포함된 자바스크립트가 동작하면서 DOM 객체를 실행할 때 악성 스크립트가 동작하는 방식

 

해결방안

* 서버 단에서 입력 값 검증 필요

* 특수문자를 일반 문자로 치환 처리

SQL Injection

SQL 질의를 변조/삽입하여 비정상적으로 DB를 접근하는 기법

* 무료 SQL Injection 취약점 스캐너 - Nikto, SQLMap, Absinthe

 

Form SQL Injection

HTML Form 기반 인증을 할 경우, 사용자 인증 sql query의 조건절(where)이 항상 참이 되도록 조작

 

예시 코드

$sql = "SELECT id, pass FROM member WHERE id='$id' and pass='$pass'";

 

id 입력란에 아래와 같은 코드 삽입으로 공격

 

MYSQL

' or 1=1#

 

MSSQL, Oracle

' or 1=1--

 

예방

* 특수문자 Escape 처리

php.ini
---------------
magic_quotes_gpc = On
---------------
mysql_real_escape_string()

 

* 선처리 질의문(Prepared Statement)을 통해 SQL Injection 방지

$stmt = $connecti->prepare("SELECT id, pass FROM member WHERE id=? AND pass=?");
$stmt->bind_param("ss",$id,$pass);
$stmt->execute();
$stmt->bind_result(&col1,$col2,$col3);

 

* 파라미터 필터링(Parameter Filtering)을 통한 SQL Injection 방지

    BlackList 문자열 생성 후 해당 문자열이 포함될 경우 사용할 수 없도록 설정.

 

Union SQL Injection

UNION을 이용하여 다른 쿼리문의 결과와 결합해 공격하는 기법

컬럼 개수를 파악해서 진행해야 한다.

 

ex) id 입력란에 order by를 이용하여 컬럼 개수를 파악한다.

오류가 발생할 경우, 해당 테이블의 컬럼이 이전 컬럼까지 존재한다는 것을 유추할 수 있다.

' order by 3 #

 

SQL Injection 대응 방안

1. 문자열 필터링

2. MS-SQL 확장 프로시저 제거

3. WAS의 dbuser 권한 제한

4. Prepared Statement 사용

 

Error-Based SQL Injection

SQL 쿼리에 따른 에러 값을 기반으로 DB 정보를 수집하여 공격하는 기법

 

Blind SQL Injection

질의 결과의 True/False를 통해 의도하지 않은 SQL 쿼리를 실행시키는 기법

SNMP(Simple Network Management Protocol)

Polling 방식

UDP/161 사용.

Manager가 요청한 정보를 Agent가 응답하는 방식.

주기적이거나 상태 변화 정보를 수집하는데 사용.

 

Event Reporting 방식

UDP/162 사용.

Agent에 Event 발생 시 Manager에 정보를 전달하는 방식.

 

SNMP 보안

Community String

Server와 Client가 데이터를 교환하기 전에 인증을 위해 사용하는 String 값

 

RO(Read-Only) 설정

RO를 설정하여 중요 설정을 수정할 수 없게 수정

 

SNMPv3 보안

USM(User Security Model) - 비인가 사용자에 의한 데이터의 무결성 침해, 기밀성 침해, 재사용 공격에 대응

VACM(View-based Access Control Mode) 

Authoritative Engine - 재전송 공격 방지

보안 매개변수

msgAuthoritativeEngindID/Boots/Time - 메시지의 유효 시간을 계산하여 재전송 여부 파악

msgUserName, msgAuthenticationParameters - 메시지 위변조 공격 방지

msgPrivacyParameters - 정보노출 공격 방지

FTP 능동 모드(Active mode)

Active mode - 일반적인 모드.

Control Channel(TCP/21)과 Data Channel(TCP/20)로 구분

 

Client가 Control channel에 접속 후 데이터 요청하면,

Server의 Data channel에서 Client로 연결을 생성하여 데이터 전송

 

* 방화벽 설정 시 Control channel 접속 후, Data channel에는 접속 불가.

 

해결방안

* Client 단 방화벽에 원격 FTP Data Channel 허용

* 수동 모드(Passive mode)를 사용

 

FTP 수동 모드(Passive mode)

Client가 Server의 Data channel을 생성하여 데이터 전송

 

* 서버측 방화벽에서 Data channel에 사용하는 Port를 모두 허용해야함.

 

해결방안

* 방화벽에서 상태 검사(Stateful Inspection)를 활성화 하여 연결 상태 추적

 

FTP Bounce Attack

Control channel과 Data channel이 분리되어 있고,

Data channel을 생성할 때 임의의 목적지 IP와 Port 번호를 설정할 수 있는 FTP 구조적 취약점을 이용한 공격

 

* Data channel에서 'PORT' 명령을 이용하여 내부 시스템에 연결 시도 혹은 네트워크를 스캔 가능

* 공격파일을 업로드 요청하면서, 'PORT' 명령을 조작하여 내부 서버로 파일 전달

 

TFTP Attack

UDP/69을 사용. 별도의 인증과정 없이 디렉터리 접근 가능.

 

해결방안

* TFTP 기능 비활성화 혹은 secure mode 활성화

tftp
---------------
...
service tftp
{
    #disable		= yes	## 비활성화
    ...
    disable		= no
    server_args		= -s /tftpboot	## 최상위 디렉터리 설정(Secure mode)
    ...
}

 

Anonymous FTP attack

* 익명 접속 비활성화

anonymous_enable=NO

 

FTP 접근 제어 설정

ftpusers / user_list
----------
root
daemon
ftpuser
----------
userlist_enable=YES