ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Secure Coding - SQL injection
    Java/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의 위험이 있다. 배치파일은 ${}을 쓸 수 밖에없는데 쓸때마다 만들어야 한다.

    반응형

    댓글

Designed by Tistory.