SQL 주입(SQL Injection)
웹 해킹의 가장 대표적인 사례로서 웹 소스의 보안 취약점을 이용하여 데이터베이스에 요청하는 SQL을 임의의 값으로 변조하여 의도된 동작과는 다른 동작을 하게 하여 원하는 데이터를 생성 또는 얻어내는 공격이다.
가장 큰 특징은 저비용으로 고효율의 결과물을 얻어낼 수 있다는 것이다.
DDoS등의 공격 방식처럼 비용이 많이 필요하지 않고 SQL 주입 공격은 단순 PC 한 대면 원하는 결과물을 얻어낼 수 있다.
OWASP(Open Web Application Security Project)에서는 정보 유출, 악성 파일 및 스크립트, 보안 취약점 등을 연구하며 4년마다 한번 웹 취약점 순위 Top10을 발표하는데 이 목록에서 가장 높은 순위가 매겨져있다.(2017년)
피해 사례
국내에서 최근 가장 유명한 피해사례는 다음과 같다
(2017년 3월) '여기어때' 고객정보 유출(링크) - 약 990,000명 피해
(2015년 10월) '뽐뿌(ppomppu) 회원정보 유출 - 약 1,960,000명 피해
공격 방식과 종류
데이터베이스와 연결된 웹 어플리케이션에서 필터링이 제대로 이루어지지 않은 채 사용자의 입력을 받아 처리하는 SQL이 있을 경우 사용자 입력을 조작하여 본래 기능을 잃게 하거나 우회하여 원하는 SQL을 실행시켜 데이터를 훔쳐오거나 조작, 또는 비정상 데이터를 주입하여 계정 데이터베이스 등의 경우 관리자 권한을 획득하는 등의 공격을 수행한다.
A. 오류 기반 SQL 주입(Error-Based SQL Injection)
가장 많이, 그리고 기초적으로 사용되는 기법이며 SQL의 논리적 오류를 이용하여 SQL을 주입하는 방법이다.
가장 많이 사용되는 기법인 만큼 예제와 함께 알아보겠다.
정상적인 로그인에서의 계정 확인 구문의 예시는 다음과 같다. (INPUT_ID/PW는 사용자 입력, id/pw는 데이터베이스)
(정상적 SQL) SELECT * FROM users WHERE id = 'INPUT_ID' AND pw='INPUT_PW'
다음은 로그인 데이터 입력에서 INPUT_ID 부분을 비정상적 데이터를 넣어 오류를 발생시키고 우회시키도록 하겠다.
아래는 비정상 데이터와 주입 시 SQL이다.
(비정상 데이터) ' or 1 = 1 --
(비정상적 SQL) SELECT * FROM users WHERE id = '' or 1 = 1 -- ' AND pw= 'INPUT_PW'
동작 원리는 입력된 비정상 데이터의 맨 앞에 있는 작은따옴표(')가 SQL에 있던 작은따옴표와 만나 문자가 끝났다고 인식하여 다음 데이터를 처리하기 위해 or을 만난다.
or은 둘 중 하나라도 참이면 참인 논리식인데 이후의 1 = 1이라는 계산식이 참이 되며 WHERE문은 참이 되어 데이터를 가지고 올 수 있게 되는데 이 순간 SQL을 끝내기 위해 주석(--)을 사용한다.
주석으로 인해 SQL은 비정상 데이터까지를 SQL의 끝으로 인식하고 명령을 실행하게 되고 위 예제의 경우 모든 데이터를 가져오고 로그인같은 경우 모든 데이터의 최상단에 있는 계정으로 로그인하게 된다.
데이터베이스로부터 특정한 값과 정보를 전달받을 수 없고 참과 거짓의 응답을 이용하는 기법이다.
로그인, 아이디 중복확인 등에서 서버가 응답하는 로그인 오류, 아이디 중복 등의 메시지를 이용해 공격할 수 있다.
위와 마찬가지로 참과 거짓의 응답을 이용하는 기법이며 사용하는 함수는 SLEEP, BENCHMARK가 있다.
데이터베이스에는 특정한 SQL들을 묶어 하나의 함수처럼 사용할 수 있도록 하는 저장 프로시저(Stored Procedure)가 존재하는데 이것이 목표가 되며 공격자가 관리자 권한을 얻고 해당 기법을 이용하게 되면 데이터베이스 뿐만 아니라 서버 시스템에서의 명령 실행까지 가능해 서버 시스템까지 위협이 되는 기법이다.
SQL을 HEX로 인코딩하여 다량의 데이터베이스의 데이터를 변조해 악성 코드를 주입하여 홈페이지에 접근하는 사용자들을 감염시키는 등으로 사용되는 기법이다.
'Security > 취약점과 공격' 카테고리의 다른 글
크리덴셜 스터핑(Credential Stuffing) 공격 (0) | 2021.07.06 |
---|---|
타이포스쿼팅(Typosquatting Attack) 공격 (0) | 2021.06.29 |
버퍼 오버플로우 공격(Buffer Overflow Attack) (0) | 2020.01.28 |
분산 반사 서비스 거부 공격 :: DRDoS (0) | 2020.01.26 |
레이스 컨디션(Race Condition) 공격 (0) | 2020.01.25 |