본문 바로가기

기초공부/WEB

SQL INJECTION

(관련 문제 풀 때마다 추가하여 정리할 것)

SQL INJECTION

SQL을 사용하여 웹사이트의 데이터베이스에 접근하는 기법

SQL INJECTION 기법

기본 방식

입력 폼에서 or 연산을 이용해 조건식을 참으로 만들어 데이터에 접근하는 방식이다.
예시 - LOS 1번

예를 들어 일반적으로 로그인을 하면 SELECT * FROM table WHERE id='yourID' and pw='yourPW' 쿼리문에 id와 pw 값을 전달하여 실행된다.
이 때 pw로 입력 하는 값 뒤에 'or 1=1과 같이 항상 참인 조건을 입력하면 최종적인 쿼리문은 SELECT * FROM table WHERE id = 'idexample' and pw='pwexaple'or 1=1이 된다.
WHERE 조건문 뒤의 연산은 FALSE AND FALSE OR TRUE 연산이 된다. 즉, FALSE OR TRUE = TRUE가 되어 데이터베이스에 접근할 수 있게 된다.

AUTO TYPE CAST를 이용해 우회할 수 있다 (예시 - LOS 18번)

Union SQL INJECTION

Blind SQL INJECTION

SQL INJECTION과 같이 원하는 데이터를 가져올 쿼리를 삽입한다. 다만 쿼리의 참/거짓에 대한 서버의 반응만으로 데이터를 얻어낸다. substr, ascii 함수를 이용하여 한 글자씩 끊어온 값을 아스키코드로 변환시키고 임의의 숫자와 비교하여 참/거짓을 비교하는 과정을 반복하여 결과들을 조합하여 원하는 정보를 얻어낸다. 많은 비교과정이 필요하므로 자동화된 툴을 사용한다.
예시 - LOS 4번

Error based SQL INJECTION

에러메세지를 출력할 때만 쓸 수 있다

if/case절을 이용하여 조건부로 에러를 발생시켜 blind sql injection을 할 수 있다.(예시 - LOS 21번)
if/case가 필터링 되었다면 괄호와 or 연산자를 이용하여 blind sql inejction을 할 수 있다.(예시 - LOS 22번)

Stored Procedure SQL INJECTION

Time Based SQL INJECTION

null인 %00을 만나면 무조건 끝나는 것을 이용하여 공격한다.

우회 - URL ENCODING (URL 인코딩 포스팅)

  1. 공백 : (), /**/, %09, %0a, %0b, %c, %0d, %a0, +, %20 (예시 - LOS 5번)
  2. %0a은 \n, %0d는 \r , %09는 \t이다.
  3. ereg, eregi에서 %00 사용시 문자가 필터링 되지 않음
  4. 주석 #: %23 (예시 - LOS 2번)

필터 우회 - 문자열일 경우

  1. preg_match 함수로 문자열이 필터링되었을 때는 문자열을 숫자로 변환하자 (예시 - LOS 3번)
    admin을 다음과 같이 변환할 수 있다.
    • 16진법 : 0x61646d696e
    • 2진법 : 0b0110000101100100011011010110100101101110
  2. ereg, eregi 함수일 때 (예시 - LOS 8번)
    • 특수문자 : %00 이용 (예시 - LOS 16번)
    • 문자열 : 대소문자 변환
      ex) admin을 aDMIn과 같이 변환하기
  3. str_replace 함수일 때 (예시 - WEBHACKING.kr 24번)
    • 필터링되지 않게 필터링 된 문자 집어넣기
      자세한 설명은 이 쪽
  4. substr( 이 필터링되었을 때는 substring 함수를 사용하자 (예시 - LOS 11번)
  5. substr 이 필터링되었을 때는 left, right 함수를 사용하자 (예시 - LOS 12번)
  6. substr 이 필터링되었을 때는 와일드카드를 사용하자 (예시 - LOS 12번)
  7. 공백, \t, \r, \n이 필터링되었을 때는 %0b나 %0c를 사용하자 (예시 - LOS 14번)

필터 우회 - 연산자일 경우

  1. or : || (예시 - LOS 6번)
  2. and : && (예시 - LOS 7번)
  3. = : like (예시 - LOS 11번)
  4. ' 이 필터링되었을 때는 "을 이용하자 (예시 - LOS 12번)
  5. = 과 like가 필터링되었을 때는 in 이나 instr함수를 이용하자 (예시 - LOS 13번)

필터 우회 - 특수문자일 경우

  1. preg_match 함수일 때 '가 필터링되었다면 \을 이용하자 (예시 - LOS 17번)
  2. 주석은 #, --, /**/, ;%00을 쓸 수 있다.
    • -- 뒤에 공백이나 제어문자가 와야한다
    • /*을 쓰면 */가 뒤에 와야한다.
    • ;%00은 magic_quotes_gpc가 off로 설정되어야 사용할 수 있다. (예시 - LOS 18번)

'기초공부 > WEB' 카테고리의 다른 글

[Flask]빠르게 시작하기 - 디버그 모드  (0) 2019.05.20
[Flask]빠르게 시작하기 - 기본 애플리케이션  (0) 2019.05.20
[PHP]Superglobals, $_SERVER  (0) 2019.05.06
[PHP]getenv  (0) 2019.05.06
[PHP]쿠키cookie  (0) 2019.04.05