웹 해킹의 개념
UNION
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)이 있는지 확인합니다
- 과정 >
- ORDER BY 1 → 정상 실행
- ORDER BY 2 → 정상 실행
- 위 과정을 반복하다가 에러 발생
- 에러가 발생하기 직전의 숫자가 해당 테이블의 열 개수입니다
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와 비밀번호 데이터를 확인할 수 있습니다