1. Lab 개요

이번 실습은 상품 카테고리 필터에서 발생하는 SQL Injection 취약점을 이용하여, 현재 Query가 조회하고 있는 상품 테이블이 아닌 다른 테이블의 데이터를 조회하는 문제이다.
앞선 실습에서는 UNION SELECT를 이용하여 다음 두 가지를 확인하였다.
- 기존 Query가 반환하는 컬럼의 개수
- 문자열 데이터를 출력할 수 있는 컬럼
이번 Lab에서는 이를 실제 데이터 조회에 활용한다.
The database contains a different table called users, with columns called username and password.
To solve the lab, perform a SQL injection UNION attack that retrieves all usernames and passwords, and use the information to log in as the administrator user.
데이터베이스에는 users 라는 이름의 다른 테이블이 있으며, 그 테이블에는 username 와 password 라는 이름의 열이 있습니다.
이 실습 과제를 해결하려면 SQL 인젝션 UNION 공격을 수행하여 모든 사용자 이름과 비밀번호를 추출하고, 해당 정보를 사용하여 해당 administrator 사용자(관리자)로 로그인하십시오.
Lab 설명을 통해 데이터베이스에 다음과 같은 테이블이 존재한다는 정보가 제공된다.
Table : users
또한 users 테이블에는 다음 두 개의 컬럼이 존재한다.
username
password
따라서 이번 실습의 목표는 UNION SELECT를 이용하여 users 테이블의 username, password 값을 조회하고, 그중 administrator 계정의 비밀번호를 확인하여 관리자 계정으로 로그인하는 것이다.
2. 실습 환경 및 취약한 파라미터 확인
Lab에 접속하면 상품 목록과 함께 여러 카테고리 필터를 확인할 수 있다.

특정 카테고리를 선택하면 다음과 같은 요청이 발생한다.

/filter?category=Accessories
여기서 SQL Injection 공격 지점은 다음 파라미터이다.
category
서버에서는 해당 값을 SQL Query에 사용하여 선택한 카테고리의 상품을 조회하는 것으로 볼 수 있다.
따라서 Burp Suite에서 해당 요청을 확인한 뒤 Repeater로 전송하여 category 파라미터를 변조한다.

3. SQL Injection 취약점 확인
먼저 category 파라미터에 작은따옴표(')를 추가하여 서버의 반응을 확인하였다.

Accessories'
해당 요청을 전송하자 서버에서 500 Internal Server Error가 발생하였다.

이는 입력값에 의해 SQL Query의 문법 구조가 깨졌을 가능성을 나타낸다.
이후 다음과 같이 정상적으로 참이 되는 조건과 주석을 추가하였다.

Accessories' OR 1=1--
해당 요청에서는 다시 정상적인 200 OK 응답이 반환되었다.

이를 통해 category 입력값이 SQL Query 구조에 영향을 줄 수 있으며, 해당 파라미터에서 SQL Injection이 가능함을 확인할 수 있다.
4. 기존 Query의 컬럼 수 확인
UNION SELECT를 이용해 다른 테이블의 데이터를 조회하려면 먼저 기존 Query와 동일한 개수의 컬럼을 반환해야 한다.
따라서 NULL 값을 이용하여 컬럼 수를 확인하였다.
먼저 하나의 컬럼으로 요청하였다.

' UNION SELECT NULL--

해당 요청에서는 오류가 발생하였다.
다음으로 두 개의 컬럼을 지정하였다.

' UNION SELECT NULL,NULL--
이번에는 정상적인 200 OK 응답이 반환되었다.

따라서 기존 SQL Query가 반환하는 컬럼의 개수는 다음과 같다.
2개
즉 이후 UNION SELECT 공격에서도 두 개의 값을 반환하도록 구성해야 한다.
5. 문자열 데이터 호환 여부 확인
이번 Lab에서 조회하려는 username과 password는 모두 문자열 데이터이다.
따라서 두 컬럼 모두 문자열 데이터를 반환할 수 있는지도 확인할 필요가 있다.
다음과 같이 두 컬럼에 임의의 문자열을 삽입하였다.

' UNION SELECT 'abc','def'--
요청을 전송한 결과 정상적인 응답이 반환되었다.

따라서 두 컬럼 모두 문자열 데이터와 호환되는 컬럼임을 확인할 수 있다.
이를 정리하면 다음과 같다.
1번째 컬럼 → 문자열 사용 가능
2번째 컬럼 → 문자열 사용 가능
따라서 users 테이블의 username과 password를 각각 두 컬럼에 대응시켜 조회할 수 있다.
6. users 테이블 데이터 조회

The database contains a different table called users, with columns called username and password.
To solve the lab, perform a SQL injection UNION attack that retrieves all usernames and passwords, and use the information to log in as the administrator user.
데이터베이스에는 users 라는 이름의 다른 테이블이 있으며, 그 테이블에는 username 와 password 라는 이름의 열이 있습니다.
이 실습 과제를 해결하려면 SQL 인젝션 UNION 공격을 수행하여 모든 사용자 이름과 비밀번호를 추출하고, 해당 정보를 사용하여 해당 administrator 사용자(관리자)로 로그인하십시오.
이번 Lab에서는 데이터베이스에 users 테이블이 존재하고, 해당 테이블에 다음 컬럼이 존재한다는 정보가 제공된다.
username
password
따라서 다음과 같은 Payload를 구성하였다.
' UNION SELECT username,password FROM users--

구문을 나누어 보면 다음과 같다.
UNION SELECT
기존 SQL Query의 결과에 새로운 Query 결과를 추가한다.
username,password
조회할 두 개의 컬럼을 지정한다.
FROM users
데이터를 가져올 users 테이블을 지정한다.
마지막으로,
--
이후에 이어지는 기존 SQL Query를 주석 처리한다.
따라서 전체 Payload는 다음과 같다.
' UNION SELECT username,password FROM users--
7. 사용자 계정 정보 확인




Payload를 전송하면 기존 상품 데이터와 함께 users 테이블의 데이터가 추가로 반환된다.
즉 원래 화면에는 상품명과 상품 설명 등이 출력되지만, UNION SELECT를 통해 추가된 행에는 다음과 같이 사용자 정보가 표시된다.
administrator [password]
carlos [password]
wiener [password]
실제 계정명과 비밀번호 값은 Lab이 생성될 때마다 달라질 수 있다.
이번 실습에서는 이 중 다음 계정을 확인한다. (관리자 계정 정보이다.)
administrator
그리고 해당 행에 함께 출력된 비밀번호 값을 확인한다.

administrators
l5bfjn3kthu92sderd3u
이로써 SQL Injection을 통해 원래 상품 Query와 직접적인 관계가 없는 users 테이블의 계정 정보까지 조회할 수 있음을 확인하였다.
8. administrator 계정 로그인
확인한 관리자 계정 정보를 이용하여 My account 페이지에서 로그인을 시도한다.

Username에는 다음 값을 입력한다.
administrator
Password에는 앞선 SQL Injection을 통해 확인한 비밀번호를 입력한다.
Username : administrator
Password : l5bfjn3kthu92sderd3u
Log in 버튼을 선택하면 관리자 계정으로 로그인이 성공한다.

9. 결과 확인
로그인 이후 현재 사용자가 administrator로 표시되는 것을 확인할 수 있다.
또한 Lab 상태가 Solved로 변경되면서 실습이 정상적으로 완료되었다.
이번 실습에서는 단순히 SQL Query의 조건을 조작하는 수준을 넘어,
' UNION SELECT username,password FROM users--
구문을 이용하여 다른 테이블에 저장된 사용자 계정 정보까지 조회할 수 있었다.
10. 핵심 정리
이번 실습의 핵심은 UNION 기반 SQL Injection을 이용하여 현재 Query가 조회하는 테이블이 아닌 다른 테이블의 데이터를 가져오는 것이다.
먼저 기존 Query의 컬럼 수를 확인하였다.
' UNION SELECT NULL--
500 Internal Server Error
다음으로 두 개의 컬럼을 사용하였다.
' UNION SELECT NULL,NULL--
200 OK
따라서 기존 Query가 반환하는 컬럼은 2개임을 확인하였다.
또한 다음 Payload를 이용하여 두 컬럼 모두 문자열을 처리할 수 있음을 확인하였다.
' UNION SELECT 'abc','def'--
이후 Lab에서 제공한 테이블 및 컬럼 정보를 이용하여 다음 Payload를 구성하였다.
' UNION SELECT username,password FROM users--
그 결과 users 테이블에 저장된 사용자 이름과 비밀번호가 응답에 포함되었으며, 그중 administrator 계정의 비밀번호를 확인할 수 있었다.
최종적으로 해당 계정 정보를 이용하여 로그인함으로써 Lab을 해결하였다.
전체 흐름을 정리하면 다음과 같다.
category 파라미터 확인
↓
SQL Injection 취약점 확인
↓
UNION SELECT 컬럼 수 확인
↓
2개 컬럼 확인
↓
두 컬럼의 문자열 호환 여부 확인
↓
users 테이블의 username/password 조회
↓
administrator 비밀번호 확인
↓
관리자 계정 로그인
↓
Solved
'Web Hacking > PostSwigger_BSCP' 카테고리의 다른 글
| [PortSwigger] SQL Injection - UNION 공격을 이용한 문자열 컬럼 확인 (0) | 2026.09.16 |
|---|---|
| [PortSwigger] SQL Injection - UNION 공격을 이용한 컬럼 수 확인 (0) | 2026.09.16 |
| [PortSwigger] SQL Injection - 로그인 우회 (0) | 2026.09.16 |
| [PortSwigger] SQL Injection - WHERE 절을 이용한 숨겨진 데이터 조회 (0) | 2026.08.11 |







































