본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
SQL Injection
  • 웹 페이지의 입력값을 통해서 SQL명령어를 주입하여 오동작을 일으키는 해킹방법
  • OWASP TOP10에서 꾸준히 상위권을 유지하는, 가장 흔한 웹해킹 기법 중 하나

공격 유형 및 예제

편집 원본 편집
  • 대상
select * from users where username = ' +username+ ' and password = ' +password+'
  • 공격
username : 1' or 1=1 --
  • 결과
    • username이 1이거나 1=1인 경우의 결과가 출력된다.
    • 1=1은 항상 참이고 그 뒷부분은 -- 를 통해 주석처리되므로 항상 결과가 출력된다.
    • 결과가 있는지 여부를 통해 로그인을 검증하는 경우 로그인이 통과된다.
select * from users where username = '1' or 1=1 -- ' and password = ''

테이블 명 알아내기

편집 원본 편집
  • 대상
select * from users where username = ' +username+ ' and password = ' +password+'
  • 공격
username : ' having 1=1--
  • 결과
    • 에러를 발생시켜 테이블 명이 users 라는 것을 확인할 수 있다.
[Error] 'users.id' 열이 집계 함수에 없고 GROUP BY 절이 없으므로 SELECT 목록에서 사용할 수 없습니다.

블라인드 SQL 인젝션

편집 원본 편집
  • SQL 인젝션을 통해 단순히 참 거짓을 판단할 수 있는 상황에서 실제 값을 파악하기 위한 공격
  • 일반적인 SQL 인젝션에 대해 방어가 잘 되어 있는 경우라도 블라인드 SQL이 동작하는 경우가 많다.
  • ex)
SELECT * FROM users where id='admin' and ascii(substr(select pw from users where id = 'admin', 1, 1)) < 100 -- and pw='nomatter'
  • 본 SQL 인젝션을 통해 admin 계정 비밀번호의 첫번째 글자 아스키 코드가 100 이하인지 알 수 있다.
  • 이런 공격을 반복하면 한글자 한글자 파악 가능하다.

공격으로 일어나는 일

편집 원본 편집

SQL 인젝션은 주입한 SQL 이 DB 에서 그대로 실행되는 공격이므로, 결과는 그 SQL 로 할 수 있는 일로 정해진다.

유형 내용 예
인증 우회 로그인 조건을 항상 참으로 만들어 비밀번호 없이 로그인한다 ' or 1=1 --
데이터 노출 다른 테이블이나 계정 정보, DB 구조를 읽어 낸다 UNION SELECT, 오류 메시지·블라인드 기법으로 테이블명 추출
데이터 변조·삭제 쌓은 쿼리로 값을 바꾸거나 테이블을 지운다 ; UPDATE ..., ; DROP TABLE ...
원격 명령 실행 DBMS 의 확장 기능으로 운영체제 명령을 실행한다 MS-SQL 의 xp_cmdshell
  • 서비스 거부(DoS)는 SQL 인젝션의 공격 유형으로 보지 않는다. 무거운 쿼리로 DB 를 느리게 만들 수는 있지만, 서비스 거부는 자원을 고갈시키는 별개의 공격 분류다 → 서비스 거부 공격
  • 입력값 검증
    • 데이터 타입: 예를 들어 숫자만 입력되어야 하는 필드에 숫자가 아닌 것이 입력되었으면 에러 처리를 한다.
    • 길이 검증: 5글자만 입력되어야 하는 필드라면 5글자로 제한한다.
    • addslashes: 입력값에 ' 와 같은 특수문자가 있으면 로 처리하여 특수문자로 동작하지 않도록 한다.
    • 허용 문자 제한: 영문자·숫자처럼 필요한 문자만 허용(화이트리스트)한다. 따옴표, 세미콜론(;), 주석 기호(--) 같은 기호·구두 문자까지 허용하는 것은 대책이 되지 않는다.
  • Prepared Statement
    • 가장 확실한 방법이다.
    • DBMS 드라이버에서 입력값은 SQL 문장이 아닌 오직 입력값으로만 동작되도록 구분하여 처리한다.
query("SELECT * FROM user WHERE id=:id", $bind["id"]=$_GET['id'])
  • 웹 방화벽 이용
    • 서버에 웹 방화벽 제품을 설치하여 공격을 탐지 및 차단한다.
    • 패턴 기반으로 분석하여 SQL 인젝션으로 보이는 요청이 있으면 차단한다.
  • 원시 에러 미출력
    • SQL 인젝션 시 ODBC 등에서 발생하는 원시 에러를 통해 DB구조를 유추한다.
    • 오류메시지는 직접 출력되지 않도록 설정한다.