SQL 삽입은 구문 분석 및 실행을 위해 데이터베이스 엔진에 전달되는 문자열에 악성코드를 삽입하는 공격이다.
아래 그림을 토대로 알아보자.

아이디 키워드를 가지고 해당 아이디를 조회하는 사이트가 있다. 이러한 사이트에서 다른 회원들의 값을 모두 불러올수 있다.

이러한 방식을 SQL Injection이라고 한다. 이번주 공부한 UNION SQL Injection에 대해 기록하기전에 쉬운 과제가 하나있었는데.
개념을 하나 짚고 넘어가면 좋을것같다.

데이터를 추출하는 페이지다 그치만 기본적으로 normaltic이 조건으로 들어가있어 password를 맞게 입력하여야 데이터가 조회된다.
딱히 알 수는 없으니 모든 데이터를 조회할 수 있는 값을 입력.

여기까지보면 그저 기초적인 SQL Injection 이지만
과제 내용은 이 페이지에서 'doldol'의 값만 조회되도록 하는것 이였다.
이미 조건문에 id ='normaltic'이 있는 상황.
doldol의 값을 조회하기 위해서는 앞의 값을 거짓으로 만들어야한다.
여기서 짚고 넘어가야할 개념이 나온다.
where 이후에 나오는 AND/OR은 AND가 먼저 연산 된다는것.
'or '1'='1을 추가하였다고해서 그저 무조건 참이기 때문에 모든 값이 조회되는구나 하고 넘어가면 문제가 생길수도 있다.
select * from member where id ='normaltic' and pass ='' or '1'='1' 에서
(where id ='normaltic' and pass = '') 가 먼저 연산되고 그 후 or '1'='1'이 연산되기 때문에 참이 되어
select * from member [(where id ='normaltic' and pass ='') or '1'='1'] <소괄호 -> 대괄호 순 실행>
(where id = 'norma....pass='') -> [거짓 or '1'='1'] -> 참 실행
이러한 과정을 통해 select * from member가 실행되기 때문에 모든 값을 불러온 것이다
그래서 doldol 값을 불러오기 위해서는 앞에값은 거짓으로 만들고 뒤에 doldol을 조회하는 조건문만 참으로 만들어주면 된다.

UNION SQL Injection
순서는 다음과같다. 제일 아래 실습 추가
1. SQL Injection 포인트 찾기.
페이지에 SQL Injection이 가능한지 여부를 따져보는곳
항등식을 삽입하여 데이터가 그대로 오는지 확인해보면된다.

>이상없이 불러오는것 확인
2. COLUMN 개수 찾기.
> Order by로 체킹.
실제 조회되는 컬럼의 개수와 보여지는 데이터의 개수가 다를수 있기때문에
'order by 1# ...'order by 2# 과 같은 방식으로 컬럼의 개수를 확인한다. (없는 컬럼으로 Order by를 하게 될시 에러가 생기기 때문)

3. 출력되는 Column 위치 찾기.
> xxx%' union select 1,2,3,4 #
컬럼의 개수를 확인했다면 union 구문을 통해 임의로 삽입한 구문이 출력되는 위치를 확인할 수 있다.
이 위치를 토대로 DB이름, 테이블이름, 컬럼이름을 뽑아내는 형식이다.

4. DB 이름 확인
> select database()

5. Table 이름 확인
> information_schema.tables
> select table_name from information_schema.tables
> where table_schema = 'DB이름'

6. Column 이름 확인
> information_schema.columns
> select column_name from information_schema.columns
> where table_name = '테이블이름'

7. Data 추출.
> 테이블 이름, 컬럼을 확인했다면 원하는 데이터를 추출할수 있다.
실습내용
두가지 실습을 하였다. 모든 과정은 위 글과 비슷하지만 다른점이 몇가지 있었다. 그거에 대해서만 이야기 해보려한다.
1.SQL Injection 2
우선 1.SQL Injection 포인트 찾기

첫번째로 normaltic을 검색한결과와 normaltic' and '1'='1 (항등식) 을 삽입한 결과
info값을 그대로 받아오는걸 보니 데이터베이스에 SQL Injection 공격이 가능하다는것을 알게 되었다.
ID 부분에 그대로 출력되는걸 보고 구문이 제대로 실행되지 않았나 싶었지만 INFO를 보아하니
GET방식을 통해 ID 열에 그대로 출력되는것 같고 SQL 구문은 내가 원하는대로 이상없이 동작한것같다.
그 이후 컬럼 개수를 확인하고. 조회되는 위치를 확인하려는데
normaltic' union select 1,2,3,4,5,6 # 을 하게되면 조회되는 위치가 확인되지않고 normaltic에 대한 정보만 올라오게 된다.
분명히 union 은 되었을텐데 보이지않는가 싶어 normaltic을 조회하지 않게 구문을 수정해주었다.
'union select 1,2,3,4,5,6 # 을 하여야 출력이된다 ( 암호화 된 값 덕분에 더 헷갈림 )
> 한 행씩만 출력되는 페이지 확인

그 이후는 위의 글대로 이어나가면 된다. 6번째 열에 DB이름을 조회하고(sqli_5), 테이블 이름(flag_honey), 컬럼(flag)을 조회하여 데이터베이스의 정보를 얻어내었다.

음.. 여기없단다.
아무래도 위에서 확인한 바와 같이 한 행씩만 출력이 되는 페이지다 보니 첫번째 값만 보여지고 그 이상의 값들은 숨겨진것 같다.
limit offset 구문을 활용하여 다른 DB도 있는가 테이블도 있는가 확인해보았다.
game_user 테이블과 secret 테이블이 숨겨져있었다.


이러한 과정을 통해 flag 획득!
2. 도박관리자
이또한 크게 다를게 없어 다른점에 대해서만 다뤄보려한다.

해당 페이지의 데이터베이스를 해킹하는 미션인데.
위의 글들과 다르게 내가 sql구문을 입력할수도 조회할수도 없다.
그래서 각각 Lucky Slots / Royal Roulette / Blackjack Pro 를 눌러보니
해당하는 값들을 데이터베이스에서 조회하여 가져오는것같다.
그럼 이 과정에서 내가 SQL Injection 공격을 할 수 있을것 같다는 생각이 들었다.

GET 방식으로 game_name을 가져가 서버가 데이터베이스에서 game_name에 해당하는 데이터를 가져오는 형식인것 같다.
game_name을 바꿔서 삽입해보았다. (URL 형식으로 보내주어야함)


이상없이 데이터를 가져오는 것 확인
> 1.SQL Injection 포인터 찾기 완료
2. 컬럼의 개수 찾기.
여기서부턴 크게 다를게 없다.
Order by 구문을 URL 방식으로 보내주면 된다.
13을 넘을경우 에러가 생기는것을 확인.

> 컬럼의 개수 12
3. 조회되는 위치 확인.


이 이후는 DB 조회, TABLE_NAME 조회, COLUMN 조회를 하게되면 원하는 데이터를 추출할 수 있게 된다.


'웹 해킹' 카테고리의 다른 글
| SQL Injection 문제 풀이 [3,4,5,6] (0) | 2025.05.27 |
|---|---|
| ErrorBased SQL Injection / Blind SQL Injection + Python 프로그래밍 (0) | 2025.05.27 |
| 쿠키, 세션 그리고 JWT (0) | 2025.05.19 |
| 게시판 CRUD, 페이징, 검색 (1) | 2025.05.13 |
| JWT/PHP 로그인 (0) | 2025.05.13 |