simple_sqli_chatgpt
문제 정보
- 어딘가 이상한 로그인 서비스입니다.
- SQL INJECTION 취약점을 통해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.
사이트에 접속하면 이런 화면이 뜬다.
로그인 페이지에는 'userlevel'이라는 입력 필드가 있으며, 이 필드를 이용하여 로그인이 가능하다.
여기서 문제를 살펴보면 해당 코드는 다음과 같은 동작을 수행한다.
- "database.db"라는 파일이 현재 디렉토리에 존재하지 않으면, SQLite 데이터베이스를 생성한다.
- 생성된 데이터베이스에 'users'라는 이름의 테이블을 생성한다. 이 테이블은 'userid', 'userpassword', 'userlevel'이라는 3개의 컬럼을 가진다.
- 'guest'와 'admin' 두 개의 사용자 계정을 추가한다. 'guest' 계정은 비밀번호가 'guest'이고 ‘userlevel’이 0이다. 'admin' 계정은 비밀번호가 무작위로 생성된 16바이트 길이의 hex 문자열로 설정되고 ‘userlevel’이 0이다.
- 변경된 내용을 데이터베이스에 반영하고 데이터베이스 연결을 닫는다.
userlevel에 0을 입력하면, Hello guest가 출력된다.
또 문제에서 다음 코드를 살펴보면 다음과 같은 동작을 수행한다.
- POST 요청이 들어오면, request.form.get() 함수를 사용하여 userlevel 파라미터를 가져온다.
- 가져온 userlevel 값으로 데이터베이스를 쿼리하여 일치하는 사용자를 찾는다.
- 사용자 정보가 존재하면, 첫 번째 사용자 정보를 가져온다. 이 때 가져오는 정보는 'userid', 'userpassword', 'userlevel' 컬럼의 값을 모두 포함하게 된다.
- 가져온 사용자 정보의 'userid'와 'userlevel' 값을 확인하여, 'admin' 계정인 경우 flag 값이 나오게 된다.
- 'admin' 계정이 아닌 경우, "hello {userid}” 창을 반환한다.
- 사용자 정보가 존재하지 않는 경우, 'wrong'이라는 메시지를 포함한 alert 창을 반환한다.
이 코드는 사용자가 입력한 userlevel 값으로 데이터베이스를 쿼리하는 구문에서 SQL 인젝션 취약점이 존재한다. userlevel 값이 SQL 구문에 그대로 포함되기 때문에, 사용자가 조작한 입력값으로 데이터베이스를 쿼리할 수 있다. 따라서 0' and userid='admin'— 값을 userlevel 값에 넣어주면 되겠다.
0' and userid='admin'-- 값을 userlevel 값으로 넣어주면 해당 구문은 다음과 같이 변경된다.
SELECT * FROM users WHERE userlevel='0' and userid='admin'--'
이 구문을 실행하면, 'admin' 계정의 정보가 반환된다. 이때, 사용자 정보의 'userid'와 'userlevel' 값을 확인하여, 'admin' 계정인 경우 flag 값이 나오게 된다. 따라서, 이렇게 조작된 입력값을 입력하면 flag 값을 얻을 수 있다.
'Web Hacking > Dreamhack 풀이' 카테고리의 다른 글
command-injection-1 (0) | 2023.06.25 |
---|---|
simple_sqli (0) | 2023.06.25 |
CSRF-2 (0) | 2023.06.25 |
CSRF-1 (0) | 2023.06.25 |
XSS-2 (0) | 2023.06.25 |