SQL Injection

임재성·2024년 1월 6일

SQL Injection

무엇인가?

  • SQL 인젝션은 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식.
  • 주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생.
  • 공격하기에 쉽지만 그에 비해 미치는 영향이 매우 크기 때문에 항상 신경써야하는 부분이다.
  • Injection 계열의 취약점들은 테스트를 통해 발견하기는 힘들지만 스캐닝툴이나 코드 검증 절차를 거치면 보통 쉽게 발견되기 때문에 탐지하기 쉬운편.
  • 매우 잘 알려진 취약점 공격이기에 대부분의 서버는 해당 공격에 대한 방어가 되어있다.
  • 다른 웹사이트에 시도하면 법적 처벌을 받으니 모의해킹 용도로 만들어진 곳에서만 해야한다.

공격 방식

  • 공격하려는 서버에서 로그인 관련 처리를 할때

    SELECT user FROME user_table WHERE id='아이디' AND pw='비밀번호';

    와 같은 쿼리문으로 동작하게 될 것이다.

  • 일반적인 사용자는 로그인시 ID : test, PW : test1234 와 같은 일반적인 문자열을 입력할 것이다.
    하지만 공격자가 ID : test, PW : ' OR '1' = '1 과 같은 내용을 입력하고 로그인을 시도했다고 했을 때, 쿼리문은

    SELECT user FROME user_table WHERE id='test' AND pw='' OR '1' = '1';

    과 같이 작성되어 실행될 것이다.

  • 이렇게 된다면 '1' = '1'로 인해서 앞의 모든 내용이 만족하게 되므로 로그인이 가능하게 된다.

  • 또한 ' or 1=1 -- 과 같은 내용을 비밀번호에 삽입해도 똑같은 결과가 나타난다.
    -- 의 의미는 이후의 내용은 모두 주석이라는 뜻.

예방법

prepared statement

  • 쿼리문을 사용자의 입력값과 조합하기 전에 미리 준비해 놓고, 입력값을 자동으로 변환해준 뒤 준비해 두었던 쿼리문과 합하여 실행하게 됨.

    String prepareStatement = "SELECT * FROM USERS WHERE name = ? AND password =?;
    PreparedStatement preparedStatement = connection.prepareStatement(prepareStatement);
    preparedStatement.setString(1, loginName);
    preparedStatement.setString(2, loginPassword);

ORM

  • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것.
  • ORM을 통해 쿼리문을 생성하게 되면 자동으로 공격이 될만한 부분들을 예방해서 실행시켜줌.

테스트 사이트

profile
조금씩 앞으로

0개의 댓글