Study/Web

SQL Injection

seomj 2021. 6. 14. 18:32

SQL Injection이란?

악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터 베이스가 비정상적인 동작을 하도록 조작하는 행위

주로 입력값에 대한 검증이 없기 때문에 발생

 

 

Error based SQL Injection

가장 많이 쓰이고, 대중적인 공격 기법

 

대표적인 예시로 로그인을 처리하는 쿼리가 있다.

아래 쿼리를 보면 id와 password를 받아온다.

 

여기서 id로 admin'-- 을 입력하게 되면

주석 이하의 구문은 실행되지 않게 되어 password 값없이 로그인에 성공하게 된다.

 

' or 1=1 -- 도 많이 쓰인다.

 

 

 

Union based SQL Injection

두 개의 쿼리문에 대한 결과를 통합해서 하나의 테이블로 보여주게 하는 키워드

이를 성공하면 원하는 쿼리문을 실행할 수 있게 됨

 

<조건>

- Union하는 두 테이블의 컬럼 수가 같아야 함

- 데이터 형이 같아야 함

 

예시로 Board라는 테이블에서 게시글을 검색하는 쿼리문이다.

여기서 INPUT으로 Union 키워드와 함께 컬럼 수를 맞춰서 SELECT 구문을 넣어주게 되면 두 쿼리문이 합쳐져서 하나의 테이블로 보여지게 된다.

 

 

아래는 사용자의 id와 passwd를 요청하는 쿼리문이다.

인젝션이 성공하게 되면, 사용자의 개인정보가 게시글과 함께 화면에 보여지게 된다.

 

 

Blind SQL Injection

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

 

 

Boolean based SQL

로그인 폼을 통해 데이터베이스의 테이블 명을 알아내는 예시이다.

 

ASCII를 통해서 숫자 값과 비교해 테이블명을 알아내게 된다. 자동화 스크립트를 통하여 단기간 내에 알아낼 수 있다.

 

 

Time based SQL

현재 사용하고 있는 데이터베이스의 길이를 알아내는 예시이다.

 

숫자 1 부분을 조작하여 데이터베이스의 길이를 알아낼 수 있다.

 

 

 

보안

입력 값에 대한 검증

 

Prepared Statement 구문 사용

 

Error Message 노출 금지

 

웹 방화벽 사용