[CS]SQL Injection

지영·2023년 6월 21일
0

CS

목록 보기
27/77
post-thumbnail

SQL Injection

1. 정의

해커에 의해 조작된 sql쿼리문이 데이터베이스에 그대로 전달되어서 비정상적인 명령을 실행시키는 공격 기법

2. 공격 방식

1) 인증우회

Authentication 이후 Authorized되어야 하는데, Unauthorized임에도 Authorized하게 하는 방식

  • 정상적인 인증방법
SELECT *
FROM USER
WHERE ID = "ABC" AND PASSWORD = "1234";

  • 비정상적인 인증방법
    (EX: 비번을 입력함과 동시에 다른 쿼리문도 함께 입력/WHERE 절에 OR문을 추가하여 '1' = '1'과 같은 true문을 작성하여 무조건 적용되도록 수정한 뒤 DB를 마음대로 조작)
-- 1)
1234; DELETE * FROM USER WHERE ID = "1"; // 모든 db 내용 삭제

-- 2)
-- 입력값
UserID: admin'--
Password: 아무거나
-- 실행쿼리문
Select * From Users Where UserID = 'admin'-- And Password = '아무거나'
// admin이라는 계정이 있을 시 pswd를 몰라도 통과

--3)
-- 입력값
UserID: test
Password: 1234' or '1'='1
-- 실행쿼리문
Select * From Users Where UserID = 'test' And Password='1234' or '1'='1'
// test 계정이 없어도 true처리되어 통과

2) 데이터노출

시스템에서 발생하는 에러 메세지를 고의로 노출시켜 서버의 구조를 유추하고 추후 해킹에 활용. (에러 메세지 : 개발자가 버그 수정 시 사용하기 때문에 서버의 구조를 알 수 있음. 따라서 배포할 때는 안나타나도록 조치해야 함)

3. 방어방법

1) INPUT 검사

: input값을 받을 때마낟 특수문자가 있는지의 여부를 검사. 로그인 전에 검증로직을 통해 미리 설정한 특수문자들이 들어왔을 때 요청을 막음

2) 에러 메세지 감추기

sql 서버 오류 메세지를 감추기 위해 view를 활용한 원본 테이블 접근을 막음. 일반 사용자는 view의 권한으로만 접근하여 에러 메세지를 볼 수 없다고 함

3) Pre-parse-statement 활용하기

Preparsestatement란, 특수문자를 그대로 문자로 받는 형식.(즉, 쿼리문에서 전달인자 값을 ?로 받는 것) 이 필터링을 통해 공격을 방아함.

profile
꾸준함의 힘을 아는 개발자가 목표입니다 📍

0개의 댓글