[웹보안] SQL Injection

SQL Injection 개요

  • OWASP TOP10에서 꾸준히 상위권을 유지하는, 가장 흔한 웹해킹 기법 중 하나
  • 웹 페이지의 입력값을 통해서 SQL명령어를 주입하여 오동작을 일으키는 해킹방법
  • 해커에 의해 조작된 SQL 구문이 데이터베이스에 그대로 전달되어 비정상적인 DB 명령을 실행시키는 공격 기법

SQL Injection 종류

1. Error based SQL Injection (논리적 에러를 이용한 SQL 인젝션)

  • 에러메세지를 보고 데이터베이스의 구조를 알아내는 방법
  • 일부러 에러메세지를 출력시켜, 원하는 정보(db명, 테이블명, 컬럼명 등)를 알아내는 것
  • 기본적으로 웹 애플리케이션은 쿼리 수행 중 오류가 발생하면 DB오류를 그대로 브라우저에 출력하며, 이 오류 정보를 통해 DB의 스키마 정보나 데이터가 유출될 수 있다.

SELECT user FROM user_table WHERE id='USER1' AND password='1234';

IDPW
USER11234

일반 유저는 위와 같이 로그인할 것이다.

SELECT user FROM user_table WHERE id='random' AND password=' ' OR '1' = '1';

IDPW
random' OR '1' = '1

비밀번호의 입력값이 true AND false OR false 가 되는데,
AND 연산보다 OR 연산의 우선순위가 빠르기 때문에 해당 구문의 연산 값이 TRUE가 됨
ID, PW를 몰라도 로그인에 성공할 수 있음

2. Union SQL Injection

Union: 두개 이상의 쿼리를 요청해 결과를 얻는 SQL 연산자
두개 이상의 쿼리를 사용한다는 점을 이용해 공격자가 원래의 요청에 추가 쿼리를 삽입하여 정보를 획득하는 기법
단 Union 쿼리는 2개의 테이블이 동일한 필드 개수와 데이터타입을 가져야 하므로 사전공격을 통해 해당정보를 얻어야 한다.

IDPW
admin' union select * from user--nomatter

SELECT user FROM user_table WHERE id='admin' union select * from user-- AND password='nomatter';

ID로 위 정보를 입력하면, -- 이후는 주석처리가 되므로 user 테이블의 모든 정보를 조회할 수 있다.

3. Blind SQL Injection

  • 에러가 출력되지 않는 사이트에서 이용 가능한 방법
  • SQL Injection 을 통해 단순히 참, 거짓을 판단할 수 있는 상황에서 실제값을 알아내기 위한 공격 (참, 거짓에 따라 서버의 반응이 달라야 사용 가능)
  • 일반적인 SQL 인젝션에 대해 방어가 잘 되어있는 경우라도 블라인드 SQL이 동작하는 경우가 많음
  • 임의의 SQL 쿼리를 이용해 정보를 얻어내는 것은 일반적인 SQL Injection과 비슷하나 쿼리 결과에 따른 서버의 반응을 통해 공격하는 기법
  • SUBSTR함수나 ASCII 함수, Limit 를 이용하는 방법이 있음
IDPW
' and ascii(substr(select pw from users where id = 'admin', 1, 1)) < 100 --nomatter

SELECT user FROM user_table WHERE id='admin' and ascii(substr(select pw from users where id = 'admin', 1, 1)) < 100 AND password='nomatter';

위 SQL 인젝션을 통해 admin 계정 비밀번호의 첫번째 글자 아스키 코드가 100 이하인지 알 수 있다.
이런 공격을 반복하면 한글자 한글자 파악 가능하다.


SQL Injection 대응 방법

1. 입력값 검증

  • 데이터 타입 검증
  • 길이 검증
  • 특수문자 동작 제어

2. Prepared Statement

  • 가장 확실한 방법
  • SQL 쿼리를 사전에 컴파일하여 변수만 따로 넣어 실행시키는 것
  • 변수를 문자열로 바꾸는 것이라 안전함
client.query("SELECT * FROM stooges WHERE name IN ($1, $2, $3)", ['larry', 'curly', 'moe'], ...);
  • 웹 방화벽 이용
    서버에 웹 방화벽 제품을 설치하여 공격을 탐지 및 차단
    패턴 기반으로 분석하여 SQL 인젝션으로 보이는 요청이 있으면 차단
  • 원시 에러 미출력
    오류메시지는 직접 출력되지 않도록 설정

참고
https://itwiki.kr/w/SQL_%EC%9D%B8%EC%A0%9D%EC%85%98
https://namu.wiki/w/SQL%20injection
https://m.mkexdev.net/427
https://m.blog.naver.com/lstarrlodyl/221837243294
https://dongdd.tistory.com/48

좋은 웹페이지 즐겨찾기