워게임/CryptoHack

[CryptoHack] CRYPTO ON THE WEB(JSON in JSON)

작성자 - ikbak_2

 

JSON in JSON

문제 설명

우리는 어떻게 결함있는 검증이 JWT들의 보안을 부술 수 있는지 조사해왔지만,
때때로 코드를 악용하여 예상하지 못한 데이터에 서명할 수 있다.

https://web.cryptohack.org/json-in-json/

풀이

더보기
import json
import jwt # note this is the PyJWT module, not python-jwt


FLAG = ?
SECRET_KEY = ?


@chal.route('/json-in-json/authorise/<token>/')
def authorise(token):
    try:
        decoded = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
    except Exception as e:
        return {"error": str(e)}

    if "admin" in decoded and decoded["admin"] == "True":
        return {"response": f"Welcome admin, here is your flag: {FLAG}"}
    elif "username" in decoded:
        return {"response": f"Welcome {decoded['username']}"}
    else:
        return {"error": "There is something wrong with your session, goodbye"}


@chal.route('/json-in-json/create_session/<username>/')
def create_session(username):
    body = '{' \
              + '"admin": "' + "False" \
              + '", "username": "' + str(username) \
              + '"}'
    encoded = jwt.encode(json.loads(body), SECRET_KEY, algorithm='HS256')
    return {"session": encoded}

 

일단 코드를 보면
지난 문제들과 비슷하게 디코딩후 
admin이 true인 상태이면 
이를 플래그값을 보여주는 형식이다

하지만 이전 문제와 다른점은 
authorise함수에서
admin인지 확인할 때 True를 큰따옴표를 이용한걸 보아선 
boolean값이 아닌 string값으로 확인한다.

그리고 create_session함수에서도 
json형태를 body라는 변수에도 역시 boolean값인 False을 큰따옴표를 이용하여 string값이다.

admin확인 조건문

 

현재 키값을 모르는 상태이다.

그러나 해당 조건문을 보게 되면
두가지 취약한 점을 깨달을 수  있다.
1. boolean값이 아닌 string값을 통해 구별한다.
2. "False"스트링 값에대한 조건이 없기 때문에, 어쨌든 "True"스트링 값만 나오면 된다.

그래서 string값으로 username을 통한 인젝션을 시도해보았다.

create_session함수
만든 구문 : (사용자가 입력한 유저이름)","admin":"True
예시 : userMSS","admin":"True
import json

username = 'userMSS","admin":"True'
body = '{' \
              + '"admin": "' + "False" \
              + '", "username": "' + str(username) \
              + '"}'
print(body)
출력된 모습
{"admin": "False", "username": "userMSS","admin":"True"}

위의 예시로 json을 출력하였다.

그래서 "False"값이 있어도

어쨌든 "True"스트링 값으로 인증이 되는지 사이트에서 확인을 해보았다.

정답

 

인젝션한 값을 통해 JWT를 만들었고,

이를 통해 admin권한을 얻어 플래그값을 가져왔다.

플래그 값은 crypto{https://owasp.org/www-community/Injection_Theory}이다.

 

P.S.

더보기

https://owasp.org/www-community/Injection_Theory

플래그 값에 있는 사이트

 

플래그값에 있는 사이트에 들어가 보면

Injection Theory라는 글을 볼 수가 있는데

조만간 함 다뤄봐도 괜찮을 것 같다. 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.