(관련 문제 풀 때마다 추가하여 정리할 것)
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 인코딩 포스팅)
- 공백 : (), /**/, %09, %0a, %0b, %c, %0d, %a0, +, %20 (예시 - LOS 5번)
- %0a은 \n, %0d는 \r , %09는 \t이다.
- ereg, eregi에서 %00 사용시 문자가 필터링 되지 않음
- 주석 #: %23 (예시 - LOS 2번)
필터 우회 - 문자열일 경우
- preg_match 함수로 문자열이 필터링되었을 때는 문자열을 숫자로 변환하자 (예시 - LOS 3번)
admin을 다음과 같이 변환할 수 있다.- 16진법 : 0x61646d696e
- 2진법 : 0b0110000101100100011011010110100101101110
- ereg, eregi 함수일 때 (예시 - LOS 8번)
- 특수문자 : %00 이용 (예시 - LOS 16번)
- 문자열 : 대소문자 변환
ex) admin을 aDMIn과 같이 변환하기
- str_replace 함수일 때 (예시 - WEBHACKING.kr 24번)
- 필터링되지 않게 필터링 된 문자 집어넣기
자세한 설명은 이 쪽
- 필터링되지 않게 필터링 된 문자 집어넣기
- substr( 이 필터링되었을 때는 substring 함수를 사용하자 (예시 - LOS 11번)
- substr 이 필터링되었을 때는 left, right 함수를 사용하자 (예시 - LOS 12번)
- substr 이 필터링되었을 때는 와일드카드를 사용하자 (예시 - LOS 12번)
- 공백, \t, \r, \n이 필터링되었을 때는 %0b나 %0c를 사용하자 (예시 - LOS 14번)
필터 우회 - 연산자일 경우
- or : || (예시 - LOS 6번)
- and : && (예시 - LOS 7번)
- = : like (예시 - LOS 11번)
- ' 이 필터링되었을 때는 "을 이용하자 (예시 - LOS 12번)
- = 과 like가 필터링되었을 때는 in 이나 instr함수를 이용하자 (예시 - LOS 13번)
필터 우회 - 특수문자일 경우
- preg_match 함수일 때 '가 필터링되었다면 \을 이용하자 (예시 - LOS 17번)
- 주석은 #, --, /**/, ;%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 |