개발을 공부하다보면 1학년 1학기 첫 시간부터 보안의 중요성에 대해 많은 이야기를 듣는다. 하지만 이렇게 직접 sql의 취약점을 이용해서 데이터를 탈취하는 실습은 정말 처음 해봤다.
보안과 해킹에 대해서 잘 몰랐을 땐 마법(?)처럼 데이터를 훔쳐가는 줄 알았는데 굉장히 많은 지식을 가지고 굉장히 많은 노력과 정성(??)이 들어가야 데이터를 도둑질할 수 있구나.. 하는 생각이 들었다.
그 좋은 머리들을 왜 그렇게 쓰는지.. 암튼 나에겐 소중한 경험이었다.


SQL Injection 공격이란?

웹 애플리케이션의 보안 취약점을 이용해 악의적인 SQL 쿼리를 주입하여, 데이터베이스의 데이터를 탈취하거나 조작, 삭제 또는 관리자 권한 탈취 등을 시도하는 공격

사용자 입력값이 SQL 쿼리에 제대로 필터링되지 않고 포함될 경우, 공격자가 쿼리 구조를 깨고 임의의 SQL 명령을 실행하도록 만드는 보안 취약점


SQL Injection 발생 원인

1. 파라미터라이제이션 미사용
→ Prepared Statement 미사용
2. 인코딩 및 필터링 미흡
→ HTML, JS, SQL 등에서 사용자 입력값을 적절히 인코딩 하거나 SANITIZATION 하지 않음
3. 취약한 파일 경로 및 이름 처리
→ 사용자 입력을 통해 파일 경로, 파일 이름을 결정하거나 이를 직접 실행


실습

탈취할 데이터 목록

공격 순서

1. 취약한 페이지가 있는지 확인
- 공격패턴 : 'or 1=1 - (select의 where 조건절 무력화)
- sql 쿼리 동적 생성으로 인해 나타나는 취약점
2. 현재 사용하고 있는 db의 종류 확인
- union 삽입 공격
- dbms별로 고유하게 사용할 수 있는 기능들이나 기호가 있음
- 오라클 dual테이블을 활용한 질의로 오라클인지 확인 가능
3. 오라클에서 일반 유저에게 제공하는 테이블을 활용해서 테이블명, 테이블에 대한 컬럼명 알아냄
- union 삽입 공격
4. 획득한 데이터 활용 정보 탈취


1. 취약한 페이지가 있는지 확인


위의 코드처럼 플레이스홀더를 사용하지 않고 변수 이용해서 코딩하면 공격에 취약함.

(sql문은 db에 요청되는 질의를 편하게 보기위해 출력)
정상적인 입력에는 정상적인 데이터가 출력되지만,

조건문에 어떤 값이 들어가도 상관없이 무조건 참을 만들며 이후의 코드를 주석처리하여 무력화시키는 공격 코드가 들어가면 모든 정보가 노출 되어버림.


2. 현재 사용하고 있는 db의 종류 확인

사용하고있는 dbms를 알면 각 dbms마다 가지고있는 취약점을 활용해서 공격을 할 수 있음.

이렇게 dual table과 union을 이용하여 공격했을 때 위와같은 에러가 나면 우선 dual table을 사용할 수 있음을 알아낼 수 있음
→ Oracle DBMS를 사용함을 알아냄

에러가 발생하지 않을 때까지 null의 개수를 적절하게 늘려보면서 해당 테이블의 몇 개의 컬럼을 가지고 있는지 알아낼 수 있음

🔓위와 같은 공격을 통해서 알아낸 것

1. 오라클을 사용하고있다
2. select * 를 사용하는 질의문일 것이다
3. 해당 테이블은 6개의 컬럼을 가지고 있다
4. 세 번째 행과 null을 union 했을 때의 결과가 0인점을 보아 해당 컬럼은 숫자형이다


3. 오라클에서 일반 유저에게 제공하는 테이블을 활용해서 테이블명, 테이블에 대한 컬럼명 알아냄


첫 번째 행이 문자열과 union했을 때 정상 출력 → 문자형 데이터임을 알아냄
.....

세 번째 행이 숫자형과 union했을 때 정상 출력 → 숫자형 데이터임을 알아냄

이처럼 컬럼 각각에 문자형과 숫자형을 union해서 데이터 타입을 알아냄 (date 타입은 아직 알아낼 수 없음)


🔓오라클 dbms의 알려진 정보를 이용한 정보 탈취
1) USER_TABLES

  • USER_TABLES라는 일반 사용자 권한으로 READ할 수 있는 시스템 테이블이 있음
  • USER_TABLES는 사용자가 생성한 테이블의 정보가 담긴 전체 테이블 목록 추출 할 수 있음
  • 위 테이블의 테이블명 컬럼은 문자열 컬럼임
    • 조회되는 데이터를 담을만한, 개인 정보가 있을만한 이름의 테이블들로 추림

2) ALL_TAB_COLUMNS

' OR 1=1 UNION SELECT COLUMN_NAME, null, null,null,null,null FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='STUDENT' --
  • 모든 테이블의 컬럼 정보를 저장하고 있는 시스템 테이블

  • 각 컬럼에 대한 데이터 타입도 저장하고 있음

4. 획득한 데이터 활용 정보 탈취


현재 출력되는 컬럼의 개수는 3개로 제한적이므로 문자형,문자형,숫자형에 맞게 컬럼을 넣어가며 데이터 추출

날짜형인 경우 to_char()를 사용해서 문자형으로 변경하여 출력

이로써 SQL_INJECTION을 활용하여 모든 데이터 탈취 가능


🔹오늘의 나는 무엇을 잘했는지
완전 처음 보는 내용이어서 처음에는 시나리오를 완전히 이해하고 따라가는데 조금 힘이 들었지만 작은 실습 단위로 따라하고 이를 반복하면서 낯선 내용을 친근하게 익힐 수 있었다.

🔹오늘 배운 것
sql injection공격법도 배웠지만 이를 계기로 오라클 db에 대해서도 더 많이 알게되고 공부할 수 있게 되었다.

🔹좋았던 점
맨날 말로만 듣던 내용을 직접 실습으로 해 본게 의미가 있었다. 나중에 쓸 일은 없겠지만 내가 직접 공격을 해보니까 보안 코드를 짜는데 훨씬 더 도움이 많이 될 것 같았다.

🔹나만의 팁 or 복습 방법
이번 실습같은 경우는 실습 환경을 세팅해놓고 내가 해커다~ 생각을 하고 차근히 어떤 취약점을 공략해야하나 시뮬레이션을 그려가면서 복습했다. 우선 ' 가 들어가는지 보고 입력이 된다! 하면 어떤 db를 사용하는지 확인하기 위해 어떤 작업들을 했어야 하지.. 하며 공격 시나리오를 차근히 따라갔던 것 같다. 그리고 직접 하나씩 입력값을 넣으며 데이터 탈취를 위해 한 발자국씩 더 다가갔다(?)

0개의 댓글