Data Extraction

DATE : 2023/11/30

5주차 주제로 다루었던 SQL injection은 인증 우회를 목적으로 했었다.

이번 주차에도 SQL injection을 다룰 거지만, 우리의 목표는 인증 우회가 아닌 데이터 추출 되시겠다!

데이터 추출과 관련해 우리가 고려해야 하는 2가지는 다음과 같다.

(1) SQL injection 실행 가능 여부 파악

(2) 실행한 Query의 결과가 노출 되는 지의 여부

SQL injection은 DB 데이터를 사용하는 곳에서 잠재적으로 실행할 수 있을 거란 얘기는 당연할 것이다.

어떻게 해서 SQL injection을 실행할 수 있다는 여부를 파악했다고 하자.

그 후 공격을 수행해 정보를 추출했다고 한다면, 결과는

(1) 페이지에서 볼 수 있는 경우와 (ex. 게시판)

(2) 페이지에서 볼 수 없는 경우 (ex. 로그인, 아이디 중복 체크)

로 나눌 수 있을 것이다.

SQL injection은 (1) & (2) 경우 모두 데이터를 얻어낼 수 있지만,

우리는 우선 (1)에 초점을 두고 어떻게 하면 원하는 데이터를 추출할 수 있을 지에 대해 알아볼 것이다.


DB에서 정보를 꺼내와 어떠한 형태로 그 값을 페이지에 보여준다는 건,

우리가 실행 시키고자 하는 Query를 주입해 예기치 않은 정보까지 화면에 출력 시킬 수도 있다는 의미이다.

이렇게 화면에 나오는 데이터에 우리가 얻고자 하는 정보를 출력하기 위한 방법으로

SQL injection이 활용될 수 있다.

예를 들어 게시판 글을 보여주는 페이지가 있다고 할 때,

이 페이지에는 게시물의 제목, 작성자, 내용 정도의 데이터가 나온다고 가정해보자.

만약 게시물의 정보가 board table에 들어 있다고 한다면,

페이지에 나오는 데이터는 그저 board table에서 가져온 내용일 것이다.

하지만 우리는 게시판 정보가 아닌 다른 계정의 정보가 얻고 싶은 상황..!

이럴 경우에는 어떤 Query를 작성해볼 수 있을까??

게시판 정보가 아닌 다른 사용자 계정의 정보를 얻고 싶다는 건, 결과적으로

다른 table에 접근해야 한다는 의미가 된다.

다른 table에 접근하기 위한 방법을 모색하기 위해서는 우선,

게시판 정보를 가져오기 위해서 어떤 Query가 실행되는 지를 예측해 볼 필요가 있다.

기본적으로 WAS에 작성되어 있는 구문은 어떻게 건들 수 없기 때문에

이를 활용하기 위해서 파악해야 한다는 거다.

SELECT * FROM board WHERE id='___'

사용자가 게시물을 하나 선택하면, 선택한 게시물의 아이디가 전달되면서 위와 같은 구문이

완성된다고 추측해보았다.

그런데 문제는 아무리 저 Query를 쳐다보고, 째려보고, 구르면서 봐도

board table을 벗어날 수 없을 거 같다...?

우리의 목적을 이루기 위해서는 반드시 다른 사용자의 계정이 잠들어 있는 table로 접근해야 하는데..!

고민을 하던 와중 해결사로 등장한 놈이 바로 UNION이다.

Last updated