ep 08-2. SQL Injection
SQL Injection
- 악의적인 사용자가 보안상의 취약점을 이용해,
임의의 SQL문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위
- 공격이 비교적 쉬운편, 성공시 큰 피해를 입힐 수 있는 공격
공격 종류 및 방법
Error based SQL Injection
- 논리적 에러를 이용한 SQL Injection
- SQL 공격기법 중 가장 많이 쓰임, 대중적
SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
// 해커 개입
SELECT * FROM Users WHERE id = ''OR 1=1 --' AND password = 'INPUT2'
=> SELECT * FROM Users
Union based SQL Injection
- Union 명령어를 이용한 SQL Injection
- SQL에서 Union 키워드는 두 개의 쿼리문에 대한 결과를 통합해 하나의 테이블로 보여주게 하는 키워드
=(쿼리문을 하나로 합쳐주는 것)
- 정상적인 쿼리문에 Union 키워드를 사용해 인젝션에 성공하면, 원하는 쿼리문을 실행할 수 있음
- Union Injection을 성공하기 위해 두 가지 조건이 있음
SELECT *FROM Board WHERE title LIKE '%INPUT%' OR contents '%INPUT%'
//해커 개입
SELECT *FROM Board WHERE title '% ' UNION SELECT null,id,passwd FROM Users -- %'AND contents '%UNION SELECT null, id, passwd FROM Users --'%'
Blind SQL Injection
- Boolean based SQL
- 단순히 참과 거짓의 정보만 알 수 있을 때 사용
- 로그인 성공/실패 등의 메시지를 이용해 DB 테이블 정보 등을 추출할 수 있음
SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
// 개입
SELECT * FROM Users WHERE id = 'abc123' and ASCII(SUBSTR(SELECT name FROM infomation_shema.tables WHERE table_type='base table' limit 0,1),1,1)) > 100 --'AND password = 'INPUT2'
// 로그인이 될 때까지 시도
- Time based SQL
- 마찬가지로 참과 거짓의 응답을 통해 DB 정보를 유추하는 기법
- MySQL 기준으로 SLEEP 과 BENCHMARK 함수를 사용함
SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
//개입
SELECT *FROM Users WHERE id = 'abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2)) --' AND password = 'INPUT2'
// SLEEP할 때까지 시도
Stored Procedure SQL Injection
- 저장된 프로시저에서의 SQL Injection
저장 프로시저
- 일련의 쿼리들을 모아 하나의 함수처럼 사용하기 위한 것
공격에 사용되는 대표적인 프로시저
- MS-SQL의 xp_cmdshell로 윈도우 명령어를 사용할 수 있게 됨
- 공격자가 시스템 권한을 획득해야 해서 난이도⬆️
- 성공시 서버에 직접적인 피해를 입힐 수 있음
Mass SQL Injection
- 다량의 SQL Injection 공격
- 2008년에 처음 발견됨
- 기존 SQL Inject과 달리 한번의 공격으로 다량의 DB가 조작돼 큰 피해를 입힘
- 보통 MS-SQL을 사용하는 ASP 기반 웹 앱에서 많이 사요욈
- 쿼리문은 HEX 인코딩 방식을 사용해 공격함
- 보통 DB값을 변조해 DB에 악성스크립트를 삽입, 사용자들이 변조된 사이트에 접속 시 좀비 PC로 감염됨
- 이렇게 감염된 좀비 PC들은 DDOS 공격에 사용됨
대응 방안
- 입력 값에 대한 검증
- Prepared Statement 구문 사용
- Error Message 노출 금지
- 웹 방화벽 사용