-
Secure Coding - SQL injectionJava/Spring 2018. 9. 7. 14:06반응형
SQL injection
SQLi 원인 -> 1. 입력과 검증을 하지 않아서 2. statement는 안전하지 않아서 perparestatement를 써야한다.
admin으로 회원가입이 되는지 -> 로그인할 때도 비밀번호가 틀렸습니다 처럼 한방향이 아닌
아이디나 비밀번호가 틀렸습니다로 고치기
id에 admin' -- 를 주면 패스워드가 주석처리가 된다.
또는 id에 ' or 1 = 1 -- 를 하매도 인증이 성공된다.
1 = 1 이 참이니까 -- 뒤로는 무시하고 성공하게 된다.
테이블 컬럼 목록 출력 - id에 테이블쿼리를 입력한다. -> DB 테이블이 다 나온다.
테이블에 컬럼의 타입까지도 다 나온다.
ADMIN' UNION ALL SELECT USER_ID USER_PASSWORD FROM USERS -- 를 실행하면 유저의 정보가 다 나온다.
ADMIN' UNION ALL SELECT '1' '2' FROM DUAL -- 테이블의 개수를 세어 가면서 컬럼을 확인할 수 있다.
* SQLi 방어 방법
매개변수를 제공하는 방식의 API를 사용해서 막을수 있다. -> ?방식 쿼리
자세한 에러메세지가 안나오게해야한다.
바인딩 데이터를 쓸 수 없는 상태라면 취약점 제거를 위해 입력 필터링이 요구되는 특수문자 및 구문을 다 지워줘야 한다. - ', -- 등 SQLinjection에 사용되는 구문을 제거한다.
PreparedStatement의 ?를 쓰게 되면 DB한테가서 쿼리를 조합하기 때문에 안전하다. - statement는 ?를 사용하지 못한다.
USER_ID = :USER_ID 처럼 : 이런식으로 데이터를 전달한다. 순서에 맞춰서 데이터를 채워넣는다.
PreparedStatement를 사용하게 되면 모든 종류의 injection은 막을 수 있다.
MyBatis에서는 ${}을 쓰면 injection의 위험이 있다. 배치파일은 ${}을 쓸 수 밖에없는데 쓸때마다 만들어야 한다.
반응형'Java > Spring' 카테고리의 다른 글
Secure Coding - 패스워드 정책 (0) 2018.09.07 Secure Coding - Command Injection (0) 2018.09.07 Secure Coding - Paros (0) 2018.09.07 Secure Coding - 보안 취약점 관리 사이트 (0) 2018.09.07 Secure Coding - 소프트웨어 개발 방법론 (0) 2018.09.06 댓글