SQL Injection Attack
mybatis에서 자연스럽게 쓰던 #{}
한번도 의문을 갖지 않은 내 자신이 부끄러워진다.
왜 ${}
를 안쓸까?
nodejs 관련해 공부하다 SQL Injection Attack에 관해 알게되어 관련사항들을 정리해보았다.
- 공격 사례
- 15년 뽐뿌 공격 : https://www.boannews.com/media/view.asp?idx=47836&kind=1
- 17년 여기어때 공격 : https://www.bloter.net/newsView/blt201703240005
SQL Injection Attak이란?
사용자가 보안상 취약점을 이용해 임의로 sql문을 주입해 DB를 조작하는것을 뜻한다.
WHERE 절을 이용한 공격과 UNION 절을 이용한 공격이 있다.예시
사용자가 탈퇴 버튼을 눌러 자신의 계정을 삭제한다고해보자.DELETE * FROM TB_USER WHERE USER_ID = (내아이디)
위 SQL문처럼 사용자로부터 받은 조건에 해당하는 사용자를 삭제할 것이다.
하지만 사용자가 악의적인 의도를 갖고 내아이디를 입력하는 부분에'아이디' OR 1=1
등으로 항상 참이되는 조건을 입력한다면?
또는'아이디' UNION DELETE * FROM TB_USER
등으로 뒤에 전체를 날리는 구문을 넣는다면???
내 사용자 DB에 남는것은 아무것도 없을것이다...해결방법
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이 가능하므로 특수문자$,{}[]()
등을 필터링을 통해 처리해줘야한다.
테스트
- 파라미터에 '등 취약 sql문을 입력해 테스트하는 방법(비정상적인 화면이 나타나면 의심 가능)
- sqlmap : https://sqlmap.org/ 모의 sql injection 도구로 이걸 사용해 쉽게 테스트 가능하다.
'[DataBase] > DB' 카테고리의 다른 글
mysqlbinlog 에러 (0) | 2023.08.31 |
---|---|
# mysql, mariadb 백업 안된 쿼리 or 테이블 or 데이터 or 프로시저 등 복구(mysqlbinlog 이용하기) (0) | 2023.07.10 |
MariaDB root 로그인 불가 이슈 (2) | 2023.06.07 |
[장애 회고록] 디스크 I/O 병목, DB 지연 (0) | 2022.11.22 |
[DB] 무한 select 오류 해결기(트렌젝션 레벨 설정) (0) | 2022.01.21 |