[LOS] 31번 문제 풀이(alien)

1 분 소요

💡 los.rubiya.kr 31번 문제에 대한 풀이입니다.

31번(alien)

문제

image

풀이

이번 문제의 클리어 조건을 보면 다음과 같습니다.

  1. $query를 실행했을 때, ‘admin’ 이어야 한다.
  2. $query를 실행했을 때, ‘admin’ 이 아니여야 한다.
  3. $query2를 실행했을 때, ‘admin’이 아니여야 한다.
  4. $query2를 실행했을 때, ‘admin’ 이어야 한다.

보면 보기 1,2와 3,4가 각각 반대의 조건을 가지고 통과 여부를 확인하고 있습니다.

맨 처음 동일한 쿼리에 대해서, 어쩔때는 ‘admin’이 반환되고, 한번 더 실행했을 때는 ‘admin’이 반환되지 않는 쿼리를 작성해야 합니다.

이 문제를 풀기 위해서 쿼리문에 ‘시간’에 대한 조건이 들어가도록 작성해야 합니다.

이 트릭을 풀기 위해서 now() % 2sleep(1) 를 이용하는 방법이 있습니다. 처음 쿼리문을 실행했을 때는 시간의 초가 짝수 초여서 0이 반환되고, 해당 쿼리문 내에서 sleep(1) 을 해주면 동일한 쿼리문에 대해서 한번 더 연속으로 실행했을 때에는 1초가 지났기 때문에 now() % 2는 홀수 초가 되고 1이 반환되어서 연속으로 실행했을 때 0,1을 번갈아서 출력하게 됩니다.

image

이 개념을 이용해서 다음과 같이 작성해 주면 만약 첫번째 $query에서 ‘admin’이 반환되면 한번 더 쿼리를 실행했을때는 ‘admio’가 반환되게 됩니다.

select id from prob_alien where no=1 union select concat("admi",char(110 + sleep(1) + (now()%2=0)))

image

이렇게 하면 sandbox1, sandbox2번의 조건을 모두 만족하게 풀었습니다. 이번에는 query2를 봐야 하는데 query2에는 현재 싱글 쿼터(‘)가 있기 때문에 입력한 모든 쿼리문이 문자열로써 처리되고 있습니다.

image

$query2
select id from prob_alien where no='1 union select concat("admi",char(110 + sleep(1) + (now()%2=0)))'

이전 쿼리와 동일한 개념을 사용해서 싱글 쿼터(‘)로 문자열을 탈출한 뒤에 동일한 union select 구문을 복사해 주면 됩니다. 이때 추가적으로 고려해야 할 사항은 기존 query문이 수정되지 않도록 싱글 쿼터로 탈출하기 전에 주석 문자 # 을 입력해야 하고,

클리어 조건을 보면

  1. $query를 실행했을 때, ‘admin’ 이어야 한다.
  2. $query를 실행했을 때, ‘admin’ 이 아니여야 한다.
  3. $query2를 실행했을 때, ‘admin’이 아니여야 한다.
  4. $query2를 실행했을 때, ‘admin’ 이어야 한다.

2-> 3번으로 갈때 o -> x -> x -> o 이기 때문에 now()%2 = 0 에서 now() %2 =1로 바꿔줘야 합니다.

query2 : select id from prob_alien where no='1 union select concat("admi",char(110 + sleep(1) + (now()%2=0)))#' union select concat("admi",char(110 + sleep(1) + (now()%2=1)))#'

image

전체 정답 쿼리는 다음과 같습니다.

no=1 union select concat("admi",char(110%2bsleep(1)%2b(now()%2=0)))%23'union select concat("admi",char(110%2bsleep(1)%2b(now()%2=1)))%23

댓글남기기