ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL Injection
    IT/웹 해킹 2024. 1. 9. 15:36

    [이 블로그는 해킹 공부하면서 가볍게 정리용으로 기록 및 내 생각을 끄적여 두기 위한 블로그(라 쓰고 일기라 읽는)이다.]

     

    • 목차
    1. SQL이란
    2. SQL Injection 위험성
    3. SQL Injection 원리
    4. SQL Injection 종류
    5. SQL Injection 방어

    1. SQL이란

    해킹 기법에는 여러 가지가 있지만 그중에서도 고전적이면서 간단하고 강력한 해킹 기법인 SQL Injection이란 것을 알아보기 전에 간단히 SQL을 알아보자면

    Structured Query Language -> 풀어서 보자면 구조화된 쿼리 언어 라는 뜻이고 DB언어이다. 서버에는 데이터베이스가 구축되어 있을 텐데 이 데이터베이스를 만들고 삽입하고 삭제하고 수정하고 조회하는 작업을 DB언어인 SQL로 작성하는 것이다. DB에 SQL문으로 요청하면 요청된 내용을 바탕으로 DB에서 작업 처리를 수행하게 된다. 

     

    https://lockinghacking.tistory.com/8

     

    웹 서버와 DB연동하기 (phpmyadmin, db만들기, 간단한 sql)

    [이 블로그는 해킹 공부하면서 가볍게 정리용으로 기록 및 내 생각을 끄적여 두기 위한 블로그(라 쓰고 일기라 읽는)이다.] 이제는 웹 서버와 DB를 연동하여 웹 페이지에서 내가 학생의 이름을 입

    lockinghacking.tistory.com

    -참고자료-

     

    2. SQL Injection 위험성

    여기서 로그인을 하는 과정도 서버에 입력되어있는 SQL문을 이용하여 DB에 저장된 아이디와 비밀번호를 매칭해서 정보를 가져오는 행위이고, 게시판 등등 무엇이든 웹에서 사용자가 글자를 삽입할 수 있는 입력 공간이 있다면 대부분 SQL문이 사용되고 있다는 증거이다. 그러면 이미 서버에 입력된 SQL문을 내가 조작할 수 있다면 어떻게 될까?...

     

    그렇게 된다면 사용자들의 개인정보부터 회사의 모든 DB데이터가 유출될 수 있을 것이다. 그러면 이제 여기서 1차적인 피해뿐만 아니라 크리덴셜 스터핑과 같은 2차 해킹까지 당할 수 있고 아주 치명적인 공격이 될 수 있는 해킹 기법이다.

     

    3. SQL Injection 원리

    SQL Injection은 이미 서버에 코딩되어 있는 코드와 SQL문을 조작을 하여 DB를 탈취하는 것이다. 이 원리는 예를 들어 로그인 창에 아이디를 abc123을 넣고 비밀번호를 a123을 넣으면 로그인 되는 정보가 하나 있다고 가정해 보자. 서버에서는 클라이언트가 입력한 이 정보를 조회하여 DB에서 존재하는지 확인하기 위해 매칭작업을 할 텐데 이때 쿼리문은 Select문을 사용한다. 

     

    내가 만든 로그인 페이지에서 SQL문 코드

     

    이때 아이디 입력창에 기존 아이디와 틀린 abc321' or '1'='1 을 넣고 로그인을 하면 로그인이 되어버리는 신기한 현상이다. 왜 로그인이 되냐 하면 서버에서 받게 되는 SQL질의문은 select * from userinfo_table where userid = 'abc321' or '1'='1'; 으로 기존의 싱글쿼터(') 가 서버에 입력되어 있을 텐데 이것을 이용하여 조건문을 만들 수 있게 된다. 그러면 이때 조건문 or는 좌변과 우변의 값 중 하나만 참이면 참인 값으로 인식하기 때문에 로그인이 되게 만드는 것이다.

     

    4. SQL Injection 종류

     

    SQLi 의 종류는 Union SQLi, Error Based SQLi, Blind SQLi  이렇게 3가지로 나뉜다.

     

    Union SQLi는 SQLi문법의 하나인 Union을 이용하는 것인데 Select문 하나 뒤에 또 Select문을 덧 붙이는 것이다. 이를 이용하여 컬럼의 개수를 알아내고 컬럼을 알아내고 DB를 알아내는 것이다.

     

    Error Based SQLi는 잘 못된 쿼리문을 입력하면 오류메시지가 나오는 곳을 포인트로 삼고 일부러 SQL문에 Error발생 함수로 에러를 유발시켜서 DB를 알아내는 방법이다.

     

    Blind SQLi는 위 두 가지 방법이 안 먹히는 곳이지만 SQL문 자체는 먹혀 질의 응답에 따라 결과가 바뀌는 곳을 포인트로 삼아 공격하는 기법인데 DB, 컬럼, 데이터를 한 땀 한 땀 한 글자씩 알아내야 하는 수고스러움이 존재한다. 주로 코딩을 하여 자동화툴을 만들어 사용하는 게 좋다. (아스키코드로 한 글자씩 up&down 게임을 즐기고 싶은 사람은 수동작업을 하자!) 

     

    5. SQL Injection 방어

     

    SQLi를 방어하는 방법은 특정문자를 필터링하고 Preparedstatement 를 이용하면 끝이다. 그러면 SQLi공격을 막아낼 수 있다. 너무 간단하고 강력한 방어수단이다.

     

    특정문자를 필터링하는 것은 ', ", # 등등 서버에 코딩된 SQL문을 조작하지 못 하도록 서버에 js로 replace 같은 함수로 문자를 미리 받아 필터링할 글자가 들어오면 치환하여 막을 수 있는 방법이다.

     

    Preparedstatement는 기존 쿼리문에 'or '1'='1 이 들어오면 이게 하나의 조건문으로 실행될 수 있게 되는 허점을 방어할 수 있게 쿼리문을 select * from user where id = ? and password = ?; 같이 물음표를 넣는다. 그럼 하나의 필드값으로 분석하게 되어 조건문이 오게 되어도 아이디 따로 조건문 따로가 성립하지 않게 하나의 아이디로 인식하게 되어 조작을 할 수 없게 하는 방어 기법이다.

     

    그리고 이것 말고도 로그인 로직에 따라서 SQLi이 먹히지 않게 만드는 것도 가능하다. (ex 인증 분리, 개행 등) 서버에 코딩된 코드들을 단순하게 만들지 않는게 좋다. 하지만 필터링도 우회가 가능하고 Preparedstatement도 파라미터로 컬럼, 테이블명을 적용할 수 없어 order by 절에 구멍이 생긴다. 결국 다시 이 구멍들을 막을 다른 보안적인 요소를 생각하고 고안하는 게 보안의 숙명인 것 같고 알면 알수록 끝이 없다.

Designed by Tistory.