Web 모의해킹

SQL Injection

5_jinseok12 2019. 12. 20. 12:40
728x90

SQL 인젝션의 정의

 

SQL 인젝션은 데이터베이스와 연동된 웹 애플리케이션에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우 공격자가 입력폼(게시글) 및 URL 입력란에 SQL문을 삽입하여 DataBase의 정보를 열람하거나 조작할 수 있는 취약점이다.

 

OWASP 상위 10가지 웹 애플리케이션 보안 위협 목록 중에서도 최상위로 선정되어 있을 만큼 위협적인 취약점이다.

 

 

SQL 인젝션의 공격 유형 3가지

 

1. 인증 우회(AB : Auth Bypass)

- 대부분 아이디와 패스워드를 입력하는 로그인 페이지를 타겟으로 행해지는 공격이다.

SQL 쿼리문의 TRUE/FALSE 의 논리적 연산 오류를 이용하여 로그인 인증 쿼리문이 무조건 TRUE 값이 나오게 하여 무력화 하는 원리이다.

 

2. 데이터 노출(DD : Data Disclisure)

- 시스템의 에러는 실제로 보여지면 안되는 부분이다. 개발자에게는 버그를 수정할 수 있지만 반대로 공격자에게는

시스템에 대한 정보를 얻을 수 있기 때문에 악의적인 구문을 삽입하여 에러를 유발시킬 수 있다.

 

3. 원격 명령 실행(RCE : Remote Command Excute)

 

 

 

SQL 인젝션의 보안 위협

 

해당 취약점이 존재하는 경우 비정상적인 SQL 쿼리로 DBMS 및 데이터(DATA)를 열람하거나 조작이 가능하므로

사용자의 입력 값에 대한 필터링을 구현하여야 한다.

 

사용자의 입력 값으로 웹 사이트가 SQL 쿼리가 완성되는 약점을 이용하여, 입력값을 변조한 후 비정상적인 SQL 쿼리를 조합하거나 실행하는 공격이다.

 

개발자가 생각하지 못한 SQL문을 실행함으로써 데이터베이스를 비정상적으로 조작이 가능하다.

 

 

SQL 인젝션의 종류

 

1. 논리적 에러를 이용하는 SQL Injection

- 기본적인 인젝션방법이다. 기호를 통해 에러를 확인하고 논리적인 에러를 통해 시스템 권한 체크를 우회하는 기법이다

- 주로 인증 우회(AB : Auth Bypass) 할 때 많이 사용한다.

- 아래의 [그림 1], [그림 2]와 같이 인증 우회를 통해 운영자 계정을 탈취할 수 있다.

 

1-1. 페이지 관리자의 ID가 admin 이라고 가정한다.

패스워드는 모르지만 ID뒤에 'or'1 구문 또는 'or'1'='1 구문을 삽입하고 임의의 비밀번호(1234)를 입력하여 계정 탈취를 시도한다.

[그림 1] Admin 계정 탈취 시도

 

1-2. 임의의 패스워드를 입력했음에도 admin 계정이 탈취되는 것을 확인할 수 있다.

[그림 2] Admin 계정 탈취

 

 

2. Blind SQL Injection

- 악의적인 문자열 삽입 대신 쿼리의 결과 ( True or False ) 에 따라 정보를 취득한다.

- Substring 함수를 이용하여 특정 문자만 추출할 수 있으며 그 정보를 통해 공격에 대입할 수 있다.

 

ex) 가장 대표적인 구문은 아래와 같다.

a"and"1"="1#  /  a%'+and+'1%'='1# 

 

3. Union SQL Injection

- 두개 이상의 쿼리를 요청하여 결과를 얻는다. 공격자는 이를 악용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 얻어내는 방식이다.

- Union SQL Injection 을 사용하는 이유는 에러가 발생하지 않는 사이트에서는 에러 노출을 시작으로 하는 기법을 사용할 수 없기 때문에 공격을 통해 정상적인 쿼리가 수행되는지, 혹은 쿼리가 수행하지 않아 쿼리 결과가 없는지를 통해 판단할 수 있다.

- Union SQL Injection 은 공격을 시도하는 두개의 쿼리는 컬럼의 개수와 데이터의 형식이 모두 같아야 한다.

 

ex) 컬럼의 수를 확인했다면 아래의 구문을 통해 테이블이름 또는 버전 정보를 알아낼 수 있다.

'union%20select%20table_name,column_name,@@version,null,null-- 

 

 

4. Stored Procedure SQL Injection

- 저장 프로시저(Stored Procedure)은 일련의 쿼리들을 모아 하나의 함수처럼 사용하기 위한 것이다.

공격에 사용되는 대표적인 저장 프로시저는 MS-SQL에 있는 xp_cmdshell 로 윈도우 명령어를 사용할 수 있게 된다.

 

- 단, 공격자가 시스템 권한을 획득해야 하므로 공격하기 위한 난이도는 높지만 공격에 성공한다면 직접적인 피해를 입힐 수 있다.

 

 

SQL 인젝션 대응 방안

 

SQL 인젝션 소스코드 대응방법은 크게 두 가지로 분류할 수 있다. 파라미터를 통해 전달받을 때 해당 값을 문자열 치환이나 특수문자 필터링을 하는 방법이 있으며, 변수로 전달하여 데이터베이스 쿼리문으로 처리될 때, Prepared Statement' 방식을 적용하여 공격자가 임의로 입력한 쿼리문이 데이터베이스에 적용되지 않도록 하는 방법이 있다.

 

1. Prepared Statement 구문을 통한 방어

- SQL 쿼리를 선 처리하여 컴파일 한 후, 이후 입력 받는 변수 값을 항상 문자열 변수로 다루기 때문에 공격자의 악의적인 SQL 구문을 변수에 삽입하여도 SQL 구문에 영향을 미치지 않기 때문에 인젝션이 발생하지 않는다.

 

2. 데이터베이스와 연동하는 스크립트의 모든 파라미터들을 점검하여 사용자의 입력값에 대한 SQL 쿼리문이 삽입되지 않도록 특수문자 및 쿼리 예약어를 필터링

 

3. 문자열 필터링

 

문자열 필터링
‘or 1=1;-- or 1=1-- ‘)or(‘a’=’a + or 1=1--
‘’or 1=1-- ‘or ‘a’=’a Sql’ or 1=1--
“or 1=1-- “ or “a”=”a Sql” or 1=1-- ,

 

4. SQL 서버의 에러 메세지를 사용자에게 보여주지 않도록 적절한 처리

 

5. 최소 권한의 유저로 DataBase 운영

- 일반 사용자 권한으로 모든 System Procedures 에 접근하지 못하도록 웹 애플리케이션이 사용하는 데이터베이스 사용자의 권한을 제한한다.

 

6. Mysql_real_escape_string() 사용

- 데이터베이스 질의 등에서 처리할 필요가 있는 문자 앞에 백슬래시를 붙인 채 문자열을 반환한다.

- 처리해야 하는 문자 : ' , " ,\ , NULL

반응형

'Web 모의해킹' 카테고리의 다른 글

SQL인젝션  (0) 2020.11.09
Webshell 공격  (0) 2020.01.20
자동화 공격(AU)  (3) 2019.12.17
웹 테스트 환경 구축  (0) 2019.10.10
Webhacking의 1번 문제  (0) 2019.06.20