waitfor delay

DATE : 2023/12/19

[ Thinking About ] : waitfor delay

page=1&board_id=&sorting=A.REG_DT&sotingAd=ASC;if+substring((select%20user_name()),1,1)=%27a%27+waitfor+delay+%270:0:1%27&startDt=&endDt=&keyword=

다음으로 고민해볼 Query는 위와 같다.

일단 포함되어 있는 parameter를 정리해보면

(1) page = 1

(2) board_id

(3) sorting=A.REG_DT

(4) sotingAd=ASC; if substring((select user_name()),1,1) ='a' waitfor delay '0:0:1'

(5) startDt

(6) endDt

(7) keyword

총 7개로 나열해볼 수 있다.

이 중에서 집중해서 해석해야 할 부분은 아마 (4)번의 sotingAd 값인 듯하다.

sotingAd=ASC;if substring((select user_name()),1,1) ='a' waitfor delay '0:0:1'

우선 ASC가 적혀져 있는 걸 보니 정렬과 관련된 PARAMETER임을 유추할 수 있다.

SQL에서 SELECT문의 결과를 정렬할 때, order by를 사용한다는 건 이미 알고 있을 것이다.

order by는 주어진 컬럼 이름이나 index를 기준으로 Query 결과를 정렬하는 데 이때

order by name (ASC)

기본적으로 ASC가 숨겨져 있다고 생각하면 된다.

ASC가 의미하는 바는 오름차순으로, order by를 실행해본 사람이라면 ASC를 붙이지 않아도

기본적으로 오름차순 정렬된 결과를 받아봤을 것이다.

ASC와 반대로 내림차순을 의미하는 단어는 DESC이다.

기본적으로 제공되는 오름차순이 아닌 내림차순으로 결과를 정렬 시키고자 한다면

order by name desc

column name 뒤에 DESC를 적어주면 된다.

애초에 order by는 SELECT문의 맨 마지막에 작성되는 절인데

ASC or DESC는 order by절 내용 중에서도 제일 마지막에 기재되는 값이므로

sotingAd는 SELECT문 제일 마지막에 들어가는 내용을 담는 파라미터임을 예측할 수 있다.

그럼 다음으로 ASC 뒤에 작성된 내용을 해석해보자.

if substring((select user_name()),1,1) ='a' waitfor delay '0:0:1'

Query를 쭉 읽어보면 맨 마지막 부분에 waitfor delay 라는 내용이 적혀져 있다!

이는 delay를 발생 시킬 때 작성할 수 있는 구문으로 DB 종류마다 형태는 조금씩 다른데

waitfor delay는 Microsoft DB에서 사용할 수 있는 구문이다.

delay를 발생 시키기 위해서는 얼마나 오래 delay를 발생 시킬 것인지 지정해줄 필요가 있고

waitfor delay 'time_interval'

waitfor delay 뒤에 작성되는 값이 바로, 얼마 동안 delay를 유지해!라는 값이 된다.

이때 time_interval은

'h:m:s'

앞에서부터 순서대로 시간, 분, 초를 의미하며, 위에서 주어진 SQL의 내용을 예시로 보자면

'0:0:1'

1초 동안 delay를 발생 시키라는 구문이 되는 것이다.

그렇다면 어떤 조건을 만족할 때 delay가 발생하게 되는 지를 확인해보자.

if substring((select user_name()),1,1) ='a' waitfor delay '0:0:1'

여기서 if는 말 그대로 if문의 그 if이다.

즉 if문의 조건이 참인 경우에만 delay가 발생하도록 작성해둔 구문으로, 현재는 그 조건이

substring((select user_name()),1,1) = 'a'

user_name()의 결과, 제일 첫 번째 문자가 'a' 이다. 라고 작성해둔 것일 뿐!

이 조건이 맞으면 delay가 발생할 것이고, 아니라면 delay가 발생하지 않을 것이니

이로써 우리는 delay 발생 유무로 Blind SQL injection을 수행할 수 있을 것이다!

참고로 ASC 뒤에 붙어있는 세미콜론

sotingAd = ASC; if substring((select user_name()),1,1) ='a' waitfor delay '0:0:1'

SQL에서 구문을 분리해주는 역할을 하기 때문에

sotingAd 값이 전달되면 작성된 내용을 주르륵 읽다가 세미콜론을 기준으로

첫 번째 Statement가 만들어지고

세미콜론 뒤에 작성된 내용부터 즉,

if문부터 새로운 statement가 시작되는 개념으로서버에 SQL을 주입할 수 있게 되는 것이다.

따라서 ORDER BY에 사용되는 keyword를 넣어줌으로써 선행되는 Query는 문제 없이 마무리하고!

Last updated