• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

SQL 질문 드립니다.

23.04.13 09:16 작성 23.04.13 09:24 수정 조회수 193

0

public int memberUpdate(MemberVO vo) {
        String SQL = "update member set age='" + vo.getAge() + "', email='" + vo.getEmail() + "', phone='" + vo.getPhone() + "' where num='" + vo.getNum() + "'";
        
        int cnt = -1;
        getConnect();
        try {
                stmt = conn.createStatement();
                cnt = stmt.executeUpdate(SQL);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            dbClose();
        }
        return cnt;
    }

안녕하세요 강사님 저는 사이버 보안을 공부하는 학생입니다. MVC2 까지 듣고 문득 SQL인젝션이 가능한지 궁금해 실험해보니 preparedStatement를 사용하고 있어서 특정한 상황이 아닌 이상 발생하지 않는다는 걸 알게되었습니다. 그래서 Statement를 사용하면 인젝션이 성공하는지 궁금해 실험해봤는데 코드가 안전해서 그런건지 제가 실력이 부족해서인지 모르겠지만 인젝션에 계속 실패했습니다.

버프 스위트인 프록시 도구로 phone 또는 mail 파라미터 값을 조작했는데요

이해가 안가는 부분이 phone 파라미터에 ' or 1=1; # 이 쿼리를 사용하면 주석이 작동되어서 모든 테이블의 phone 컬럼이 1로 바뀌는데 ' ; update member set phone=010-4444-4444 where num=[일련번호]; # 이 쿼리를 사용하면 주석이 작동하지 않아 인젝션이 성공하지 않습니다. 혹시 무엇때문인지 아신다면 도움 부탁드립니다!

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.05.24

안녕하세요, 인프런 AI 인턴이에요. SQL 인젝션에 대한 실험을 진행하신 것 같네요.

먼저, Statement를 사용하면 SQL 인젝션에 취약하다는 것은 맞습니다. 하지만, PreparedStatement를 사용하면 인젝션에 대해 안전하다고 알려져 있습니다.

문제 상황을 보면, ‘ or 1=1; # 이 쿼리는 주석 처리가 되고 전체 테이블의 phone 컬럼이 ‘1’로 바뀌는 반면, ‘ ; update member set phone=010-4444-4444 where num=[일련번호]; # 이 쿼리는 주석 처리가 되지 않아 인젝션이 실패한다고 하셨습니다. 이렇게 되는 이유는 Statement를 사용하여 쿼리를 작성하면 특수 문자를 문자 그대로 인식하기 때문입니다. 하지만, PreparedStatement를 사용하면 자동으로 특수 문자를 이스케이프 처리하여 쿼리를 실행하게 됩니다. 따라서, PreparedStatement를 사용하면 안전하게 쿼리를 실행할 수 있습니다.

제시해주신 쿼리 ’ ; update member set phone=010-4444-4444 where num=[일련번호]; # 이 쿼리 역시 인젝션에 취약합니다. 하지만, PreparedStatement를 사용하게 되면, ?를 사용해서 쿼리를 작성할 수 있습니다. 이렇게 하면, ?에 해당하는 값이 자동으로 이스케이프 처리되어 안전하게 쿼리를 실행할 수 있습니다.

따라서, PreparedStatement를 사용하시면 SQL 인젝션에 대한 안전성이 보장되며, ?를 사용해서 쿼리를 작성하시면 특수 문자를 이스케이프 처리해서 안전하게 쿼리를 실행할 수 있습니다. 참고하시기 바랍니다.