본문 바로가기

[DataBase]/DB

[SQL] Injection Attack 예방기

반응형

SQL Injection Attack

mybatis에서 자연스럽게 쓰던 #{} 한번도 의문을 갖지 않은 내 자신이 부끄러워진다.
${}를 안쓸까?
nodejs 관련해 공부하다 SQL Injection Attack에 관해 알게되어 관련사항들을 정리해보았다.

  1. 공격 사례
  1. SQL Injection Attak이란?
    사용자가 보안상 취약점을 이용해 임의로 sql문을 주입해 DB를 조작하는것을 뜻한다.
    WHERE 절을 이용한 공격과 UNION 절을 이용한 공격이 있다.

  2. 예시
    사용자가 탈퇴 버튼을 눌러 자신의 계정을 삭제한다고해보자.
    DELETE * FROM TB_USER WHERE USER_ID = (내아이디)
    위 SQL문처럼 사용자로부터 받은 조건에 해당하는 사용자를 삭제할 것이다.
    하지만 사용자가 악의적인 의도를 갖고 내아이디를 입력하는 부분에
    '아이디' OR 1=1등으로 항상 참이되는 조건을 입력한다면?
    또는
    '아이디' UNION DELETE * FROM TB_USER등으로 뒤에 전체를 날리는 구문을 넣는다면???
    내 사용자 DB에 남는것은 아무것도 없을것이다...

  3. 해결방법
    Prepared Statement 구문사용

    • MYBATIS : 가장 많이 이용하는 SPRING & MYBATIS 조합에서 SQL Injection Attack을 방어하는 방법은
      MYBATIS에서 변수를 받을 때 ${}를 이용하지 않고 #{}을 이용하는것이다.

    • MSSQL : MSSQL 라이브러리들 통해 이용하는 방법은

      await client
      .request()
      .input('userName', sql.VarChar, userName.userName)
      .query(`DELETE FROM users WHERE name = @userName`)

      쿼리부분에서 string + 입력받은변수 로 처리하지 말고 제공 라이브러리를 통해 치환해서 이용하는 방법이 있다.

    • MySQL : MySQL 라이브러리들 통해 이용하는 방법은

      sql = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);

      위와 같이 mysql.escape(), connection.escape(), pool.escape() 함수들을 이용해 예방이 가능하다.

    • MongoDB : 몽고db등 nosql에서 조건문의 앞에 $ne를 입력한다면? 쉽게 injection이 가능하므로 특수문자 $,{}[]() 등을 필터링을 통해 처리해줘야한다.

  4. 테스트

    • 파라미터에 '등 취약 sql문을 입력해 테스트하는 방법(비정상적인 화면이 나타나면 의심 가능)
    • sqlmap : https://sqlmap.org/ 모의 sql injection 도구로 이걸 사용해 쉽게 테스트 가능하다.
반응형