Blind SQL Injection & Time Based SQL Injection

SQL인젝션과 유사하게 원하는 데이터를 가져올 쿼리를 삽입한다.

하지만 블라인드 SQL인젝션의 경우 데이터를 바로 가져오는 것과 다르게 쿼리가 참일때와 거짓일때 서버의 반응으로 데이터를 얻어야 한다.

참인 반응을 보이는 데이터를 한 글자씩 얻어와서 합치는 방식을 이용한다.

가져와야 하는 데이터가 클 경우에는 자동화 툴을 쓰면 편하다.

 

알아내려는 데이터의 길이를 파악하는게 일반적이다.

SQL의 len()함수를 이용한다.

MSSQL : len()

Oracle, MySQL : length()

(참고 사항: 주석 #의 경우에는 MySQL에서만 사용이 가능하다 --를 이용)

 

쿼리문에서 len(변수명등) = n-- 과같이 입력을 해주면 해당 문자열의 길이가 n이라면 참 아니라면 거짓이 나올것이다.

 

substr()의 사용법

MySQL : SUBSTR(), SUBSTRING()

Oracle : SUBSTR()

MSSQL : SUBSTRING()

(str, pos, len) str의 pos번째 위치부터 len개의 문자 읽음 len생략시 모든 문자 읽기

substring(컬럼명등, 1, 1)='@'-- 와 같이 사용하면 해당 컬럼의 1번째 문자가 @인지 확인 맞다면 참 아니라면 거짓

 

워게임 풀이시 많이 등장하는 아스키 문자의 범위 32, 127을 이용해 for문을 만들어주고

chr(아스키코드값)을 이용하면 해당 문자를 찾는데 편리하다.

 

Time Based SQL Injection의 경우에는 블라인드 SQL인젝션에서 제공되던 참, 거짓 결과도 제공되지 않을때 사용한다.

쿼리문이 참일 때의 반환시간과 거짓일 때의 반환시간을 다르게 하여 판별하는 것.

 

if(쿼리문, 참일때 실행될 함수, 거짓일 때 실행될 함수)

예)if(len(str)=1, sleep(3), 1)

str의 길이가 1이라면 3초 딜레이, 아니라면 1초 딜레이

 

benchmark(count, expr)

특정연산식 expr을 count회 수행한다.

myoskin