본문 바로가기
Web/Hacking

Union SQL Injection

by 09337 2023. 3. 1.

1. 취약점 개요

1.1. 정의

SQL Injection에는 여러 종류가 있다. Non Blind Sql Injection, Blind Sql Injection, Union Sql Injection 등...

이번 포스팅은 Union Sql Injection에 대한 내용이다.

 

SQL Injection은 웹 어플리케이션에서 많이 발생하는 보안 취약점 중 하나다. Union SQLi는 다수의 SELECT 문을 하나의 결과로 합쳐서 출력하는 방법이다. 이를 사용하면 데이터베이스의 테이블을 병합할 수 있다.

 

1.2. 예시

다음과 같은 쿼리가 있다고 가정한다.

SELECT id, password FROM user WHERE idx=1

결과

 

위 쿼리를 Union SQL로 변환할 경우, 다음과 같이 작성할 수 있다. 

SELECT id, password FROM user WHERE idx=1 UNION SELECT id, password FROM user WHERE idx=2;

결과

 
(주의할 점은, 각 테이블의 컬럼 개수가 일치해야한다.)
SELECT * FROM user UNION SELECT null, null, null FROM board;

user 테이블의 컬럼 수는 3개이기 때문에, board 테이블에 null 컬럼을 3개로 똑같이 채워줬다.

쿼리 결과가 제대로 리턴된다면 user 테이블의 컬럼 갯수를 확실히 할 수 있다.

 

이렇게 Union SQL을 이용하면, 데이터베이스에 있는 데이터를 불러올 때 조작이 가능하다.

이를 방지하기 위해서는 다음과 같은 보안 조치가 필요하다.

 


2. 보안 방법

2.1. 입력값 검증

입력 받는 데이터를 필터링하거나 제한함으로써, 공격자가 악의적인 코드를 삽입하는 것을 방지한다.

 

2.2. PDO 사용

PDO(php data object)와 같은 DBMS 추상화 계층을 사용한다. PDO를 사용하면 SQLi 공격을 방지할 수 있으면서도, 데이터베이스의 종류에 구애받지 않고 일관된 방법으로 데이터베이스를 조작할 수 있다.

 


3. 실습

예전에 만들어두었던 개인 사이트에서 진행했다.

UNION SELECT 1,table_name,3,table_schema,5 FROM information_schema.tables WHERE table_schema='board' #

board라는 DB의 테이블 정보를 획득하기 위한 구문이다.

 

실제로 만들어둔 테이블이 모두 노출되었다.

 

이를 활용하여 컬럼명을 구하고, 만약 패스워드와 관련된 컬럼명이 있다면, 구해둔 테이블명에서 회원정보에 관련된 테이블과 컬럼을 유추하여 데이터를 빼올 수 있다.

댓글