반응형
문제 설명
어딘가 이상한 로그인 서비스입니다.
SQL INJECTION 취약점을 통해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.
chatGPT와 함께 풀어보세요!
코드 분석
DATABASE = "database.db"
if os.path.exists(DATABASE) == False:
db = sqlite3.connect(DATABASE)
db.execute('create table users(userid char(100), userpassword char(100), userlevel integer);')
db.execute(f'insert into users(userid, userpassword, userlevel) values ("guest", "guest", 0), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}", 0);')
db.commit()
db.close()
- database.db 데이터베이스를 사용
- db 실행시 users 테이블 생성
- users 테이블에 값 userid, userpassword, userlevel 순으로 삽입함
- guest, guest, 0 그리고 admin, 랜덤16바이트 값, 0 이 들어있음
def get_db():
db = getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect(DATABASE)
db.row_factory = sqlite3.Row
return db
- _database를 가져옴
- 만약 엇다면 sqlite3.connect해서 g.database에 가져옴
def query_db(query, one=True):
cur = get_db().execute(query)
rv = cur.fetchall()
cur.close()
return (rv[0] if rv else None) if one else rv
- query_db는 쿼리를 인자로 받음
- one=True로 결과 값 하나만 반환
- 전체 행을 출력
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
userlevel = request.form.get('userlevel')
res = query_db(f"select * from users where userlevel='{userlevel}'")
if res:
userid = res[0]
userlevel = res[2]
print(userid, userlevel)
if userid == 'admin' and userlevel == 0:
return f'hello {userid} flag is {FLAG}'
return f'<script>alert("hello {userid}");history.go(-1);</script>'
return '<script>alert("wrong");history.go(-1);</script>'
- 로그인 화면
- userlevel을 이용자로부터 입력 받고 처리함
- 입력 받은 값을 query_db로 넘겨주고 res에 저장
- useid는 첫번째 , userlevel은 세번째 값 넣고 출력
- userid가 admin이고 userlevel이 0 이면 FLAG출력
취약점 분석
- 로그인에서 userlevel 값을 그대로 SQL 문자열에 삽입
- query_db가 첫 행만 반환하기 때문에 admin이 첫행으로 오면 인증을 우회해 FLAG 획득가능
익스플로잇
그냥 0 삽입 시

hello guest 라는 문구가 뜸
둘다 userlevel이 0이지만 첫행이 guest라 guest만 출력되는 것을 확인
그럼 admin이 먼저 나오게 ORDER BY를 이용 (ORDER BY 기본 값은 ASC(오름차순)이며, DESC(내림차순)이다.)
0' ORDER BY userid --
와 같은 문구를 삽입하면
select * from users where userlevel='0' ORDER BY userid --'
위와 같은 SQL문이 실행 됨

반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| image-storage (0) | 2026.02.02 |
|---|---|
| simple-ssti (0) | 2026.01.30 |
| CSRF Advacned (0) | 2026.01.23 |
| XSS Filtering Bypass (0) | 2026.01.21 |
| {"role": "admin"} (0) | 2026.01.21 |