본문 바로가기
Hacking/LOS : Lord of SQLInjection

LOS : alien

by newbie22 2020. 11. 4.

< alien 문제 모습 >

상당히 깁니다. 해석하면 다음과 같습니다.

 

필터링 

1. admin => 0x61646d696e 로 우회 가능합니다.

2. if, case => 조건절을 사용할 수 없습니다.

3. and , or => %26%26(&&), || 로 우회 가능합니다.

4. time => 처음 보는 필터링입니다.

 

문제 요구 조건

쿼리를 총 4번 실행합니다.

첫 번째 실행결과 : admin 이여야 합니다.

두 번째 실행결과 : admin 아니 여야 합니다.

세 번째 실행결과 : admin 아니 여야 합니다.

마지막 실행결과  : admin 이여야 합니다.

 

이는 같은 no의 값을 가지고 쿼리를 실행하는데 결과가 매번 바뀌어야 합니다. 즉, 조건문 없이 출력하는 결과 값이 달라야 합니다.

 

또한 query와 query2의 차이를 보면 다음과 같습니다. (처음에는 차이 없는 것으로 보고 왜 코드를 이렇게 작성했지?? 하면서 의아해했던 기억이 있네요.)

 

첫 번째와 두 번째 쿼리 : no = $_GET[no] , 세 번째와 마지막 쿼리  : no = '$_GET[no]'

즉, 싱글 쿼터의 유무입니다.

 

만약 페이로드가 or 1=1--+-라는 가정하면 이는 1, 2 실행에서는 정상 작동하나 3, 4 실행에서는 정상적으로 작동하지 않습니다. 따라서 구체적인 페이로드를 구성하기 전에 두 쿼리에 모두 정상 작동하는 or 1=1을 찾아보기로 하였습니다.

 

 

query : select * from test where id=0 or 1=1;#' or 1=1;# : 빨간색 부분 주석 처리

 

query2 : select * from test where id='0 or 1=1;#' or 1=1;#' : 빨간색 부분 문자열 처리

 

이를 통하여 2개의 쿼리에 두 개다 정상 작동하는 쿼리를 만들 수 있게 되겠습니다.

 

즉, 파라미터 no의 구성은 0 || 1=1%23' || 1=1%23 되겠습니다. 이때 || 1=1 부분만 문제의 요구에 맞게 수정하면 될 것 같습니다.

 

query를 실행할 때마다 조건문이 없이 어떻게 차이를 줄까 하고 고민하다가 문득 time이 필터링되는 것이 떠올랐습니다.

 

즉, 4개의 쿼리를 실행할 때마다 실행시간이 다르다는 것이었습니다. 하지만 보통 쿼리를 실행하는 시간을 보면 윗 사진에서 나와 있듯이 0초가 걸립니다. 따라서 sleep(1)을 주어 확실하게 실행시간에 차이를 줌으로써 이를 이용하면 될 거 같습니다.

 

또한 concat(mid('as', now()%2 + 1,1), 'dmin')를 통하여 현재시간을 2로 나눈 나머지가 0이면 admin 1이면 sdmin이 되면서 조건을 맞출 수 있습니다.

 

payload : ?no=0 union select concat(mid("as",1%2b(now()%2=sleep(1)),1),"dmin")%23' union select concat(mid("sa",1%2b(now()%2=sleep(1)),1),"dmin")%23

 

%2b = +

 

< 클리어 >

'Hacking > LOS : Lord of SQLInjection' 카테고리의 다른 글

LOS : chupacabra  (0) 2020.11.06
LOS : cthulhu, death, godzilla, cyclops  (0) 2020.11.05
LOS : zombie  (0) 2020.11.04
LOS : ouroboros  (0) 2020.11.04
LOS : phantom  (0) 2020.11.02