반응형
Topic: SQL
분야: Web
난이도: Easy
🦙 < There is a vulnerability in this login system!
🦌 < If you can login as us, we will give you a flag as a present!
🎅 < Merry Xmas! Hohoho!
코드 분석
app.post("/login")
def login():
username = request.form.get("username", "")
password = request.form.get("password", "")
if len(username) > 12 or len(password) > 48:
return "Your input is too long!"
conn = sqlite3.connect("database.db")
query = (
f"SELECT * FROM users WHERE username='{username}' AND password='{password}';"
)
error = None
try:
user = conn.execute(query).fetchone()
except sqlite3.Error as e:
user = None
error = str(e)
conn.close()
if error:
return f"SQL error: {error}"
if user is None:
return "invalid credentials"
if user[0] == "alpaca":
return f"Hello, alpaca! Here is your flag: {FLAG_1}"
elif user[0] == "reindeer":
return f"Hello, reindeer! Here is your flag: {FLAG_2}"
elif user[0] == "santa_claus_admin":
return f"Hello, santa_claus_admin! Here is your flag: {FLAG_3}"
else:
return f"Hello, {user[0]}!"
- username과 password 입력받음
- 사용자 이름이 12글자가 넘거나 password가 48길이보다 길다면 Your input is too long이라는 문자열 출력
- sqlite 데이터베이스 연결해서 입력한 username과 password 비교
- user가 alpaca면 FLAG 일부분 출력
- user가 reindeer면 FLAG2 일부분 출력
- sata_claus_admin이면 FLAG3 일부분 출력
def init_db():
conn = sqlite3.connect("database.db")
conn.execute(
"""
CREATE TABLE IF NOT EXISTS users (
username TEXT PRIMARY KEY,
password TEXT NOT NULL
);
"""
)
password_1, password_2, password_3 = (
os.urandom(16).hex(),
os.urandom(16).hex(),
os.urandom(16).hex(),
)
conn.execute(
f"""INSERT OR IGNORE INTO users (username, password) VALUES
('alpaca', '{password_1}'),
('reindeer', '{password_2}'),
('santa_claus_admin', '{password_3}');
"""
)
conn.commit()
conn.close()
- 실행 시 database.db 연결하고 테이블 생성
- 비밀번호는 랜덤 16바이트 헥스값
- 실행 시 username과 password 값 입력 alpaca, reindeer, sata_claus_admin
취약점 분석
- 입력한 값이 그대로 SQL에 실행됨
- 필터링 없음
- username만 보고 로그인함
익스플로잇
먼저 alpaca : 1234를 먼저 입력해 봄

다음과 같은 SQL 문이 실행됨
alpaca' --
를 입력해 주면 username만 alpaca인지 확인함

reindeer도 똑같이 해주면

하지만 santa_claus_admin 은 문자열 길이가 12개가 넘어 입력이 안됨 따라서 Username엔 alpaca 써주고 password에 다음과 같이 작성해 줌
1' OR username='santa_claus_admin

반응형
'Alpacahack' 카테고리의 다른 글
| Inu Profile (0) | 2026.02.11 |
|---|---|
| Plz Login (0) | 2026.02.09 |
| Magic Engine (0) | 2026.02.05 |
| Alpacahack: No JS (0) | 2026.02.01 |
| Alpacahack: Stateless Auth (0) | 2026.01.25 |