IT/영어 공부노트
SQL Injection 정리 본문
DBMS
DBMS는 데이터베이스에 새로운 정보를 기록하거나, 기록된 내용을 수정, 삭제하는 역할을한다.
Relational (관계형) |
MySQL, MariaDB, PostgreSQL, SQLite |
Non-Relational (비관계형) |
MongoDB, CouchDB, Redis |
두 종류의 차이점: 관계형은 행과 열의 집합인 테이블 형식으로 데이터를 저장하고, 비관계형은 테이블 형식이 아닌 키-값 (Key-Value) 형태로 값을 저장
RDBMS(Relational DataBase Management System)
행과 열의 집합으로 구성된 테이블의 묶음 형식으로 데이터를 관리하고, 테이블 형식의 데이터를 조작할 수 있는 관계 연산자를 제공한다.
SQL(Structured Query Language)
RDBMS의 데이터를 정의하고 질의, 수정 등을 하기 위해 고안된 언어이다. 웹 어플리케이션이 DBMS와 상호작용할 때 사용된다.
- DDL(Data Definition Language) 데이터를 정의하기 위한 언어. 데이터를 저장하기 위한 스키마, 데이터베이스의 생성/수정/삭제 행위 수행
- DML(Data Manipulation Language) 데이터를 조작하기 위한 언어. 데이터에 대해 조회/저장/수정/삭제 수행. INSERT, SELECT, UPDATE 등
- DCL(Data Control Language) 접근권한 등을 설정하기 위한 언어. GRANT와 REVOKE 등
SQL Injection
DBMS에서 사용하는 쿼리를 임의로 조작해 데이터베이스의 정보를 획득하는 공격이다.
※ 인젝션: 이용자의 입력값이 애플리케이션의 처리 과정에서 구조나 문법적인 데이터로 해석되어 발생하는 취약점
웹 서비스는 이용자의 입력을 SQL 구문에 포함해 요청하는 경우가 있다. (ex. 로그인 시에 ID/PW포함)
이 때 SQL 구문에 악성 코드를 삽입하여 데이터베이스에서 실행되게 하는 공격이다. 공격자가 승인되지 않은 작업을 수행하고, 중요한 데이터에 액세스하고, 데이터를 수정 또는 삭제하거나 잠재적으로 전체 데이터베이스 서버를 제어할 수 있다.
SQL Injection Cheat Sheet
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
https://takudaddy.tistory.com/338
동작원리
정상적인 로그인 요청 수행 과정
SQL Injection을 통한 로그인 우회
이 SQL 쿼리는 웹 애플리케이션에 admin이라는 사용자 계정이 존재한다면 패스워드가 일치하는지 여부와는 상관없이 admin 계정으로 로그인하게 된다. SQL 쿼리의 논리 연산을 조작하여 무조건 참이 되게 해서!
1. 연산자 우선순위에 따라 조건식2와 조건식3의 AND 연산이 먼저 수행된다. => FALSE (OR 보다 AND이 먼저)
2. 조건식1이 TRUE 뒷절 FALSE 구문 OR 연산 수행한다. => TRUE
=> admin 계정의 패스워드를 알 수 없어도 admin 계정으로 로그인에 성공
SQL Injection 유형
오류 기반 SQL Injection
잘못된 문법이나 자료형 불일치 등에 의해 웹 브라우저에 표시되는 데이터베이스 오류를 기반으로 수행되는 공격이다.
의도적인 오류를 유발시키고 해당 오류 정보를 바탕으로 데이터베이스 명, 테이블, 컬럼정보 등 파악할 수 있다.
UNION 기반 SQL Injection
공격자가 의도한 SQL 쿼리를 UNION 연산자를 이용하여 기존 SQL 쿼리에 덧붙이고 기존 SQL을 무효화시켜 원하는 내부 데이터를 절취한다.
Blind SQL Injection
웹 브라우저 상에 데이터베이스 오류 정보나 데이터가 직접적으로 노출되지 않을 때 이용되는 기법이다.
- Boolean 기반 SQL 쿼리의 결과에 따라 애플리케이션의 응답이 다른 경우 사용
- Time 기반 SQL 쿼리 결과가 참 또는 거짓이냐에 따라 서버의 응답 시간을 제어할 수 있을 때 사용
예방방법
1. 입력값 검사
HTTP 요청을 통해 전달되는 사용자 데이터에 SQL 구문으로 해석될 수 있는 문자나 공격에 사용되는 SQL 구문들의 포함 여부 검사 및 요청 차단이나 문자 제거
- SQL 기호 홑따옴표('), 겹따옴표("), 세미콜론(;), 대시(-), 샵(#), 슬래시샵 (/*) 등
- SQL 구문 SELECT, INSERT, UPDATE, DELETE, UNION, GROUP BY, HAVING, ORDER BY 등
2. 저장 프로시저 사용
웹 애플리케이션에서 데이터베이스에 접속하여 어떤 작업을 수행할 때 저장 프로시저를 사용하는 방법이다.
( SQL 쿼리가 저장 프로시저내에서 안전하지 않은 방식으로 처리된다면 이 또한 여전히 SQL Injection 공격에 노출되게 된다는 단점 O)
3. 매개변수화된 쿼리 적용
매개변수화된 쿼리는 자주 사용되는 SQL 쿼리를 데이터베이스에 준비해두었다가, 해당 SQL 쿼리 실행에 필요한 값들만 매개변수로 전달하여 실행하는 방식이다.
매개변수화된 쿼리를 사용하면 공격자는 SQL 쿼리의 구조를 알 수 없어 SQL Injection 방어에 유용하다.
$conn = mysqli_connect("example.com","spike","ilovejulia","bebop_db");$stmt = $conn->prepare("INSERT INTO crews (firstname, lastname, email) VALUES (?, ?, ?)");$stmt->bind_param("sss", $firstname, $lastname, $email);$firstname = $_POST['firstname'];$lastname = $_POST['lastname'];
$email = $_POST['email'];
$stmt->execute();
VALUES 절에 데이터가 입력될 곳은 물음표(?)로 표기 -> Placeholder
이 SQL 쿼리는 데이터베이스에 전송되고, 추후 사용자로부터 전달받은 데이터를 매개변수를 통해 전달(바인딩)하여 SQL 쿼리를 실행한다.
4. 최소권한 & 최소기능 사용
필요한 최소한의 권한만을 보유한 별도의 데이터베이스 계정을 사용해야 한다.
5. 데이터베이스 최신 패치 적용
참조