안녕하세요.
해킹과 방어 시리즈를 연재하고 있는 Ziqon입니다.
이제 그 첫번째 공격과 방어를 해보겠습니다.
해킹의 꽃이라 불리우는 SQL Injection! 많이들 들어보았을 것입니다.
실제로 주변의 큰 보안 사고가 발생하는 공격 방식이기도 합니다.
그럼 실습을 해볼까요?
victim 서버 구동
SQL Injection 페이지로 이동
공격 구문 수행
: 1=1 앞쪽에 싱글쿼터가 없어 조회가 안됨 -> String 형태로 변환해야 함
:각각 1을 개별 문자열이라고 가정하고 각각 싱글쿼터를 입력하여 공격하면 쿼리가 성공
간단하게 SQL Injection공격을 해보았습니다.
이번엔 이 공격을 방어하기 위한 방어코드를 실습해보겠습니다.
Find Bugs의 SQL인젝션 탐지 룰
코드 스캐닝 수행
취약점 리스트 확인
취약 코드 선택
취약 코드 확인
탐지된 라인은 보통 SQL문이 실행되는 곳이고 추적해보면 query = "SELECT ~~ "와 연결됨을 알 수 있습니다.
외부입력값이 직접 삽입된 전형적인 SQL Injection이며 이를 statement 방식이라 하고 이를 조치하기 위해서는 Preparedstatement방식으로 변경하면 됩니다.
PreparedStatement는 Statement와는 다르게 직접적으로 변수를 지정하지 않고, ?로 표시하는 바인드 변수 형태로 사용합니다. 입력값은 SetXX형태로 설정하여 입력을 처리하기 때문에 쿼리 구조가 사전 컴파일되어 외부의 악의적인 입력에도 쿼리구조는 변경되지 않아 안전합니다.
수정을 완료하면 저장하고 탐켓을 재시작합니다.
같은 페이지에 들어가 다시 Injection공격을 하면 실패하는 것을 확인할 수 있습니다.