power-girl0-0

SQL Injection 본문

웹해킹/이론

SQL Injection

power-girl0-0 2021. 3. 10. 20:48
728x90

 

해당 글은 개념을 간단히 정리하고자 작성한 글로, 실습은 다른 글에서 진행하였습니다.


 개요 

웹 어플리케이션이 database에 접근하는 과정에서, 악의적인 사용자가 악의적인 SQL문을 실행시켜 데이터베이스를 비정상적으로 조작하는 해킹 방법이다.

 

로그인 요청을 하면, DB는 계정 정보가 있는 테이블에서 해당 계정이 존재하는지 확인해야 한다.


 종류 

1. Error based SQL Injection ( =논리적 에러를 이용한 SQL Injection )


논리적 에러를 발생시킬 수 있는 패턴을 이용한 인증 우회 기법이다.

SQL Injection에서 가장 많이 쓰이며 대중적인 공격기법이다.


2. union SQL injection


union 키워드는 두 개의 쿼리문에 대한 결과를 통합해서, 하나의 테이블로 보여주게 하는 키워드이다.
단, 두가지 조건이 있는데 두 테이블의 '컬럼 수'가 같아야 하고 '데이터 형'이 같아야 한다.

 

해당 방식으로 성공하면, 원하는 쿼리문을 실행할 수 있다.


3. Blind SQL injection


데이터베이스로부터 특정한 값이나 데이터를 전달받지 않고, 단순히 참과 거짓의 정보만 알 수 있을 때 사용한다.

 

해당 공격은 Substr함수, Ascii 함수, Limit 함수 등을 이용하여 값을 구할 수 있다.

limit를 이용하여 하나의 테이블만 조회하고, substr함수로 특정 글자를 추출한 후, ascii함수를 통해 ascii값으로 변환시켜주는 방식으로 사용된다.


4. Stored Procedure SQL Injection


취약한 프로시저를 이용해 쉘을 실행하거나 쿼리 결과를 얻어낼 수 있다.

 

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

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

 

단, 공격자가 시스템 권한을 획득해야 하므로 공격 난이도가 높으나 성공하면 서버에 직접적인 피해를 입힐 수 있는 강력한 공격이다.


 예방책 

1. 입력값 검증 ( Input Validation )

SQL Injection에 쓰이는 특수문자나 SQL 명령어들이 있는지 검사하는 것으로, 입력값을 확인하여 예방하는 방식이다. 하지만 해당 방식은 정교하게 입력값을 검사하지 않는다면 검증을 우회하는 방법들이 존재하므로 사용에 주의해야 한다.


2. Prepared Statement 사용

prepared statement란, 미리 쿼리에 대한 컴파일을 수행하고 입력값을 나중에 넣는 방식이다.

 

사용자의 입력값이 데이터베이스의 파라미터로 들어가기 전, DBMS가 미리 컴파일 후, 실행하지 않고 대기한다.

그 후, 입력값을 문자열로 인식하게 하므로 공격쿼리가 들어가도 단순 문자열이기 때문에 공격자의 의도대로 작동지 않는다.


3. 보안 정책 설정

관리자를 제외한 일반 유저들에게는 최소권한만 부여하거나 SQL 에러 메시지 노출 차단.. 등등 보안 정책을 설정하여, 비인가된 유저들이 악의적으로 SQL문을 실행하지 못하게 하는 방법이다.


4. Error Message 노출 금지

SQL Injection공격을 하기 위해서는 데이터 베이스 정보(table명, column명 등)가 필요하다.

데이터베이스 에러를 따로 처리하지 않는다면, 에러가 발생한 쿼리문과 함께 에러에 대한 내용을 반환한다.

 

이는 테이블 명 및 컬럼명, 쿼리문 등이 노출될 수 있는 문제이기 때문에, 오류 발생시 사용자에게 보여줄 수 있는 메시지 박스를 띄우도록 설정해야 한다.

 

 

728x90

'웹해킹 > 이론' 카테고리의 다른 글

CMS ( 콘텐츠 관리 시스템 )  (0) 2021.03.12
Comments