SQL Injection이란?

SQL Injection은 클라이언트 입력값에 의도하지 않은 쿼리를 임의로 삽입하여 악의적인 SQL 구문을 실행하는 공격이다. 해당 취약점으로 공격자는 데이터베이스에 직접적으로 접근해 중요 정보를 조회, 탈취할 수 있다. 인젝션 공격은 OWASP TOP10에 항상 속해있고 주요정보통신기반시설 기술적 취약점 분석 가이드에도 나오는 중요한 해킹 기법이다.

정상적인 접근

id와 pw를 입력하게 되면, 데이터베이스에서 "user01"이라는 사용자를 조회하여 실행결과를 반환하여 로그인에 성공하게 된다.

비정상적인 접근

id를 다음과 같이 입력하게 되면, 데이터베이스에서 id 부분에 "admin' or '1'='1"이라는 값이 들어가 해당 쿼리가 정상적으로 작동하고 admin을 조회하게 되어 admin으로 로그인이 성공하게 된다.

 

 

SQLi 종류


Union SQL Injection

SQL 문법인 union 키워드를 이용해서 쿼리 2개를 요청해서 내부 데이터를 얻어내는 공격 기법이다. 원래 SQL 쿼리 요청문에 union으로 한개의 쿼리를 추가해서 정보를 추가해 얻어내는 것이 목적이다. 보통 검색 또는 게시글 페이지 등 데이터베이스에 저장된 데이터가 보이는 경우 사용된다.

 

Error-Based SQL Injection

에러를 직접적으로 발생시켜 정보를 얻어내는 방법이다. 에러는 문법 에러와 로직 에러가 있는데, Error Based SQLi에서는 로직 에러를 사용한다. 로직 에러는 사용자가 의도한 작업을 프로그램에서 수행하지 못하는 에러이다. sql문에는 오류가 없어서 실행될 수 있지만 결과가 개발자의 의도와 다르게 나오는 경우이다.

 

Blind SQL Injection

데이터베이스 에러 메시지나 데이터가 직접적으로 노출되지 않을 때 사용하는 공격 기법이다. union, Error Based SQLi가 먹히지 않을 때 최후의 방법이다. sql문의 결과가 참 또는 거짓에 따라 서버의 응답이 달라지는 경우에 사용되며, 공격자는 참/거짓 여부로 공격의 성공 여부를 판단한다. 대표적으로 로그인 성공 or 실패를 알려주는 로그인 페이지가 있다.

공격을 진행할 때 참/거짓으로 결과가 나오기 때문에 데이터베이스 이름, 테이블 이름, 컬럼 이름, 저장된 데이터 순서대로 한글자씩 sql문을 변경하며 정보를 얻어야 한다. 따라서 시간이 오래걸릴 수 있기 때문에 자동화가 필수이다.

 

 

대응방안

  • Prepared Statement를 사용한다. Prepared Statement란 구문 분석 과정을 수행하여 생성된 결과를 컴파일하여 메모리에 저장하는 방법이다. 사용자 입력값을 변수로 선언하여 미리 컴파일된 SQL 구문에 대입하기 때문에 SQL 문법에 영향을 미치지 않는다.
  • Prepared Statement가 불가능 할 경우 화이트 리스트기반 필터링을 진행해야한다. 안전한 문자열을 정의하고 정규표현식 등으로 패턴화 하는것이 유용하다.  

'웹 보안 > SQLi' 카테고리의 다른 글

Blind SQL Injection 실습  (0) 2025.05.08
Error-Based SQL Injection 실습  (0) 2025.05.08
Union SQL Injection 실습  (0) 2025.05.08

+ Recent posts