본문 바로가기

카테고리 없음

[WEB] SQL Injection #2

SQL Injection은 실행될 쿼리를 조작하여 권한 획득이나 데이터베이스의 데이터를 획득할 수 있다.

데이터베이스는 데이터에 쉽게 접근할 수 있도록 다양한 문법을 지원한다.

 

UNION

UNION은 다수의 SELECT 구문의 결과를 결합하는 절이다.

이를 통해 다른 테이블에 접근하거나 원하는 쿼리 결과를 생성해 애플리케이션에서 처리하는 타 데이터 조작이 가능하다.

이는 애플리케이션이 데이터베이스 쿼리의 결과를 출력하는 경우 유용하게 사용할 수 있다.

 

UNION Condition

UNION을 사용하기 위해서는 두 가지 필수 조건을 만족해야 한다.

 

1. 이전 SELECT 구문과 UNION을 사용한 구문의 실행 결과 중 컬럼의 갯수가 같아야 한다.

 

2. 특정 DBMS에서는 이전 SELECT 구문과 UNION을 사용한 구문의 컬럼 타입이 같아야 한다.

 

 

서브 쿼리 (Subquery)

서브 쿼리는 한 쿼리 내에 또 다른 쿼리를 사용하는 것을 의미한다.

서브 쿼리를 사용하기 위해서는 쿼리 내에서 괄호 안에 구문을 삽입해야 하며, SELECT 구문만 사용할 수 있다.

공격자는 서브쿼리를 통해 쿼리가 접근하는 테이블이 아닌 다른 테이블에 접근하거나 SELECT 구문을 사용하지 않는 쿼리문에서 SQL Injection 취약점이 발생할 때 SELECT 구문을 사용할 수 있다.

 

서브 쿼리 사용 예시

COLUMNS 절

SELECT 구문의 컬럼 절에서 서브 쿼리를 사용할 때는 단일 행과 단일 컬럼이 반환되도록 해야한다.

 

FROM 절

FROM 절에서 사용하는 서브 쿼리를 인라인 뷰라고 하며, 이는 다중 행과 다중 컬럼 결과를 반환할 수 있다.

 

WHERE 절

WHERE 절에서 서브 쿼리를 사용하면 다중 행 결과를 반환하는 쿼리문을 실행할 수 있다

 

Application Logic

SQL Injection은 애플리케이션 내부에서 사용하는 데이터베이스의 데이터를 조작하는 기법이다.

따라서 특정 쿼리를 실행했을 때 쿼리의 실행 결과를 보여주지 않는다면 공격자가 데이터베이스의 정보를 추측하기 어렵다.

그러나 대부분의 애플리케이션은 데이터베이스 결과에 따라 각기 다른 기능을 수행한다.

만약 애플리케이션이 특정 쿼리에 대해 참과 거짓의 결과를 출력한다면 이를 통해 공격자는 공격을 수행할 수 있다.