티스토리 뷰

반응형



웹 해킹 중 정말 간단한 공격이면서도 치명적인 공격이 몇가지 있는데요, 그 중에서 SQL Injection에 대해 이야기 해보겠습니다. SQL Injection은 입력값이 쿼리에 동적적용 시 개발자가 의도하지 않는 쿼리로 변조가 되는 취약점이죠.


SQL Injection을 방지하기 위해 가장 좋은 방법은 필터링보다는 입력값을 파라미터화 시켜 바인드 처리하여 입력값이 쿼리로 인식되지 않도록 하는 것입니다.


하지만 이 과정에서도 개발자 분들이 실수를 하는 경우가 있습니다.

대표적인 사례가 아래와 같습니다.


01. 동적쿼리 사용 시 입력값 검증

02. 잘못된 PreparedStatement 사용


이 밖에도 여러 케이스가 존재하겠지만, 위 내용에 대해 간단히 이야기 해보겠습니다.




01. 동적쿼리 사용 시 입력값 검증


쿼리를 만들다 보면 동적쿼리를 만들 때 더 효율적인 경우가 있습니다. 이럴 때는 정말 동적쿼리가 필요한지 검토를 해봐야 겠죠. 만약 반드시 동적쿼리가 필요하다고 하면 입력값에 쿼리를 변조할 수 있는 특수기호와 키워드가 포함되어 있는지 여부를 검증 후 사용해야 합니다.


가끔 입력값에 특수기호의 포함이 반드시 필요한 경우도 존재하기 때문에, 이마저도 키워드로 필터링을 하는 경우가 있습니다. 그러나 SQL Injection의 경우 정말 다양한 공격이 가능하기 때문에 키워드로 제한하는 것은 정말 좋지 못한 방법이죠. 


역시 SQL Injection을 방지하기 위해 파라미터화 시키는 것이고, 동적쿼리를 반드시 사용해야 할 경우만 특수기호 필터링을 하는 것이 가장 좋은 방법입니다.




02. 잘못된 PreparedStatement 사용


대게 개발언어는 SQL Injection을 방지하기 위해 입력값을 파라미터화 시킬 수 있는 모듈을 제공합니다.  대체로 이름은 PreparedStatement 객체로 되어 있습니다. 물론 Classic ASP와 같이 오래된 개발언어는 제공하지 않기 때문에 필터링을 해줘야 하지만 Java, ASP.NET 등 최근 언어들은 PreparedStatement 객체를 지원해 줍니다.


그런데 가끔 이 객체를 사용해서 쿼리를 생성하고 실행하긴 하지만, 잘못된 방법을 사용하여 SQL Injection이 발생하는 경우도 있습니다. 입력값을 파라미터화 하지 않고 문자열 결합으로 입력값을 사용한 동적쿼리를 만든 이후 실행만 시키는 경우가 바로 그런 경우입니다.


ex. 잘못된 PreparedStatement 사용


String sql = "select * from USER where id = " + request.getParameter("ID");

psmt = conn.prepareStatement(sql);

psmt.executeQuery();



쿼리에 문자열 결합을 하지 않고 입력값이 들어갈 위치에 ? 를 입력하여 위치를 정한 뒤 입력값은 타입에 맞는 set함수를 통해 바인드 처리하여 쿼리변조가 되지 않도록 해야 합니다.


ex. 올바른 PreparedStatement 사용


String sql = "select * from USER where id = ?";

psmt = conn.prepareStatement(sql);

psmt.setString(1, request.getParameter("ID"));

psmt.executeQuery();




아직까지 SQL Injection과 관련해서 다양한 케이스는 보지 못했습니다.

워낙에 유명한 취약점이라 대부분의 개발자 분들이 이미 바인드 처리를 통해 쿼리변조가 되지 않도록 개발을 하고 있죠.

게다가 요즘은 소스코드에서 쿼리를 생성하지 않고 MyBatis나 iBatis와 같은 프레임워크를 많이 사용하기 때문에 # 사용만으로 간단히 개발이 가능하고, 진단도 빠르게 진행됩니다. 


그래도 가끔 PreparedStatement객체를 사용하는 경우도 있으며, 이때 개발자 분들은 대체로 API정보를 잘 확인하고 사용하기 때문에 99% set함수를 사용합니다만, 그래도 실수를 하시는 분들도 계시기 때문에 진단을 하는 사람은 PreparedStatement 객체를 사용한다고 그냥 넘어가면 안되고 입력값을 제대로 바인드 처리하는지 까지 확인해줘야 합니다.






Fin

반응형

'Web Analytics > Vulnerabilities' 카테고리의 다른 글

인증실패 횟수 관련 분석  (0) 2019.04.14
Password 관련 취약점 분석  (0) 2019.03.09
Download 취약점 분석  (0) 2019.03.06
Upload 취약점 분석  (0) 2019.03.03
XSS(Cross Site Script) 취약점 분석  (0) 2019.03.01
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday