소스코드를 통해 SQL Injection이 발생하는 원인찾기
[보안 취약점 진단 및 대응/WebGoat, Bee-Box] - WebGoat(웹고트) Numeric SQL Injection
SqlNumericInjection.java
#1 eclipse에서 Ctrl + Shift + R을 눌러 SqlNumericInejction.Java를 검색합니다.
#2 문제가 되는 부분을 확인합니다.
1번 SQL문에서 station은 STATION_ID라는 값을 요청 파라미터에서 받아오고 있습니다. 이 받아온 값을 검증, 제한하지 않고 SQL문을 생성하고 있어서 문제가 됩니다. 1번 부분에서 외부 입력값에 의해 쿼리의 내용이 변경될 수 있습니다.
2번은 1번에서 생성된 쿼리를 Statement 객체로 실행하고 있습니다. Statement는 쿼리문을 안전하게 생성할 책임을 개발자가 가지고 있습니다. executeQuery(query)에서 query를 개발자가 책임지고 만들어줘야합니다.
#3 문제가 있는 코드를 수정합니다.
쿼리문을 안전하게 생성할 책임을 개발자에게 주지 않고 쿼리문을 안전하게 만들어주는 것을 보장하는 객체를 사용하는 것입니다. PreparedStatement 객체를 이용하여 쿼리를 실행합니다. PreparedStatement 객체는 쿼리의 구조를 미리 정의하고 변수에 값을 맵핑하여 실행하는 방법으로 정의된 쿼리 구조로 실행되는 것을 보장합니다.
#4 실행 결과 확인
(1) Proxy도구에서 Intercept is on으로 변경하고, 사이트에서 on을 클릭합니다.
(2) 값을 101 or 1=1로 변경하고, Intercept is off로 바꿔줍니다.
(3) 사이트를 확인해보면 에러가 발생합니다.
=> Integer.parseInt(station) 코드에서 오류가 발생