반응형

SQL Injection이란?

웹 애플리케이션과 데이터베이스 간의 연동으로 발생하는 취약점으로, 공격자가 입력 폼에 악의적으로 조작된 쿼리를 삽입하여 데이터베이스 정보를 불법적으로 열람하거나 조작할 수 있는 방식

 

SQL Injection 공격 유형

Error based SQL injection (논리적 에러를 활용한 SQL 인젝션) 

  - 가장 대중적인 기법으로, 인증 우회를 위해 논리적 에러를 유도하는 방식의 공격 기법

-- 정상적인 input
SELECT * FROM user WHERE id = 'id' AND pwd = 'pwd'

-- 비정상적인 input
'OR 1=1 --'

-- 인증 우회를 통한 비정상적 input
SELECT * FROM user WHERE id = '' OR 1=1 --
==> SELECT * FROM user 결과값 도출

 

Union SQL Injection (UNION 명령어를 활용한 SQL 인젝션)

  - 공격자가 추가적인 쿼리를 삽입하여 정보를 획득하는 기법으로, UNION 명령어를 이용하여 여러 쿼리를 합치는 방식을 이용, UNION을 하려는 두 테이블의 컬럼 수와 데이터 형식이 같아야 하므로 ORDER BY 절이나 HAVING을 이용한 오류 메시지를 통해 컬럼의 수를 유추

-- 정상적인 input
SELECT * FROM board WHERE title = 'title' and contents = 'contents'

-- 비정상적인 input
'UNION SELECT id, pwd FORM user --'

-- UNION을 통한 비정상적 input
SELECT * FROM board WHERE title LIKE '' UNION SELECT id, pwd FORM user --

==> SELECT * FROM board 컬럼에 user 정보 합계되서 결과값 도출


Blind SQL Injection (Boolean based SQL)

  - 서버의 반응을 통해 정보를 얻는 SQL 공격 기법으로, 단순히 참과 거짓의 정보한 알 수 있을 때 사용하는 공격 기법. 조건이 참이면 페이지가 정상적으로 출력되고 그렇지 않은 경우 출력되지 않음으로 구분이 가능

-- Boolean 기반 공격 예시
-- 정상적인 input
SELECT * FROM user WHERE id = 'id' and pwd = 'pwd'

-- 비정상적인 input
'abc123' and ASCII(SUBSTR((SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 --'

-- Boolean 통한 비정상적 input
SELECT * FROM user WHERE id = 'abc123' and ASCII(SUBSTR((SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 --

-- Time 기반 공격 예시
-- 정상적인 input
SELECT * FROM user WHERE id = 'id' and pwd = 'pwd'

-- 비정상적인 input
'abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2)) --

-- Time을 통한 비정상적 input
SELECT * FROM user WHERE id = 'abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2)) --

 

Stored Procedure based SQL Injection

  - 웹에서 저장 프로시저에 대한 접근 권한을 가짐으로써 정보를 탈취할 수 있는 공격 기법

 

Mass SQL Injection

  - 한 번의 공격으로 다량의 DB를 조작해 큰 피해를 입히는 공격 기법

 

SQL Injection 대응 방안

입력값 검증

  - 사용자의 입력을 받을 때 검증 로직을 추가하여 값이 유효한지 검증하는 방법
     (데이터 길이 제한, 특수문자와 명령어 필터링 등)

 

Prepared Statement 구문 사용

  - 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에 DBMS가 미리 컴파일하여 실행하지 않고 대기. 그 후 사용자의 입력 값을 문자열로 인식하여 공격 쿼리가 들어간다고 하더라도, 단순 문자열로 인식하여 공격을 무효화하는 방법

 

Error Message 노출 금지

  - SQL Injection을 수행하기 위해서는 데이터베이스의 정보가 필요하기 때문에, 오류 발생 시 사용자에게 보여주는 로그를 별도로 작업하여 데이터베이스 정보 유출 방지하여 공격을 무효화 하는 방법

 

웹 방화벽 사용

  - 웹 공격 방어에 특화되어있는 웹 방화벽을 사용하는 방법

반응형

'개발새발 > 기타' 카테고리의 다른 글

코딩 스타일 괄호 및 표기법  (1) 2021.05.27
반응형

코딩 스타일

 

코딩에는 각 사람의 습관이나 스타일이 묻어 나오는 경우가 많다. 다만, 혼자 개발하는 경우가 아닌 협업하는 경우 코드의 가독성 등을 위해 변수명, 클래스명, 괄호 등의 스타일을 통일하는 경우가 존재하는데 몇 가지의 스타일의 경우 보편적으로 용어 및 스타일이 정해져 있다.

 

코딩 스타일 (괄호)

 

대표적인 코딩 스타일에는 BSD, K&R, GNU 3가지가 존재한다. 대부분은 언어 혹은 IDE 별로 기본 포맷팅이 정해져 있으나, 개인의 선호에 따라 다르기도 하기 때문에 가볍게 보고 넘어가면 좋을 듯하다.

 

BSD

if (a = b)
{
    return result;
}

비주얼 스튜디오의 기본 포맷팅으로 사용되는 방식이다. GNU와 비슷하지만, 들여 쓰기가 없고 K&R처럼 수평으로 길게 사용 가능하다.

 

K&R

if (a = b) {
    return result;
}

이클립스에서 기본 포맷팅으로 사용되는 방식이다. 자바, 자바스크립트, C++ 등에서 주로 볼 수 있으며, 반복문 등 사용 시에도 코드량이 줄기 때문에 출판되는 개발 책 등에서도 자주 확인할 수 있다. 한눈에 많은 코드를 볼 수 있고, 수평으로 길게 사용 가능하다.

 

GNU

if (a = b) 
    {
        return result;
    }

BSD와 비슷한 방식이지만, 들여 쓰기가 존재하여 수평으로 조금 더 좁게 사용하여야 한다.

 

표기법

 

표기법의 경우 변수, 함수명, 클래스명 등을 작성할 때, 일괄적인 규격을 정하기 위하여 존재하며 괄호 등의 코딩 스타일과 달리 협업할 때는 정해진 규격대로 변수명, 함수명 등을 해당 프로젝트에 정해진 표기 법대로 작성해야 되는 경우가 많다.

 

카멜 표기법 (Camel Case)

첫 문자의 첫 글자는 소문자로 표기하고, 그 이후 연결되는 문자들은 첫 글자를 대문자로 표기한다. 문자의 형태 때문에, 단봉낙타 표기법이라고도 하며, 변수명, 함수명 등에 자주 사용된다.

ex) helloWorld

 

파스칼 표기법 (Pascal Case)

모든 문자의 첫 글자를 대문자로 표기한다. 쌍봉낙타 표기법이라고도하며, 클래스명에 자주 사용된다.

ex) HelloWorld

 

스네이크 표기법 (Snake Case)

모든 문자의 첫 글자를 소문자로 표기하며, 각 문자들은 언더바(_)로 이어서 사용한다. 변수명, 함수명, 데이터 타입 등에 사용되며, DB에서 자주 사용한다.

ex) hello_world

 

케밥 표기법 (Kebab Case)

하이픈(-)로 단어를 연결하는 표기법이다. 주로 HTML, CSS, URL 등에서 자주 사용되며, 변수나 함수 등에서는 하이픈을 못 쓰게 하는 경우도 존재한다.

ex) hello-world

 

헝가리안 표기법 (Hungarian Notation)

접두어에 자료형을 붙여서 표기하며, 현재는 잘 사용되지 않는다.

ex) strHelloWorld

 

이 외에도 사실 들여 쓰기나 공백, 주석 등 다양한 코딩 스타일이 존재하지만 해당 부분은 각 개인의 스타일에 맞춰서 개발을 진행하거나 혹은 협업 시 해당 규격에 맞춰서 작성을 진행하기 때문에 상황에 맞춰서 작업을 진행하면 크게 문제없이 개발을 진행할 수 있으리라 생각된다.

반응형

'개발새발 > 기타' 카테고리의 다른 글

SQL Injection이란?  (0) 2024.05.24

+ Recent posts