Web Hacking/Dreamhack 풀이

simple_sqli_chatgpt

박연준 2023. 6. 25. 17:26

simple_sqli_chatgpt

문제 정보

  • 어딘가 이상한 로그인 서비스입니다.
  • SQL INJECTION 취약점을 통해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.

사이트에 접속하면 이런 화면이 뜬다.

 로그인 페이지에는 'userlevel'이라는 입력 필드가 있으며, 이 필드를 이용하여 로그인이 가능하다.

 여기서 문제를 살펴보면 해당 코드는 다음과 같은 동작을 수행한다.

  1. "database.db"라는 파일이 현재 디렉토리에 존재하지 않으면, SQLite 데이터베이스를 생성한다.
  2. 생성된 데이터베이스에 'users'라는 이름의 테이블을 생성한다. 이 테이블은 'userid', 'userpassword', 'userlevel'이라는 3개의 컬럼을 가진다.
  3. 'guest'와 'admin' 두 개의 사용자 계정을 추가한다. 'guest' 계정은 비밀번호가 'guest'이고 ‘userlevel’이 0이다. 'admin' 계정은 비밀번호가 무작위로 생성된 16바이트 길이의 hex 문자열로 설정되고 ‘userlevel’이 0이다.
  4. 변경된 내용을 데이터베이스에 반영하고 데이터베이스 연결을 닫는다.

userlevel에 0을 입력하면, Hello guest가 출력된다.

또 문제에서 다음 코드를 살펴보면 다음과 같은 동작을 수행한다.

 

  1. POST 요청이 들어오면, request.form.get() 함수를 사용하여 userlevel 파라미터를 가져온다.
  2. 가져온 userlevel 값으로 데이터베이스를 쿼리하여 일치하는 사용자를 찾는다.
  3. 사용자 정보가 존재하면, 첫 번째 사용자 정보를 가져온다. 이 때 가져오는 정보는 'userid', 'userpassword', 'userlevel' 컬럼의 값을 모두 포함하게 된다.
  4. 가져온 사용자 정보의 'userid'와 'userlevel' 값을 확인하여, 'admin' 계정인 경우 flag 값이 나오게 된다.
  5. 'admin' 계정이 아닌 경우, "hello {userid}” 창을 반환한다.
  6. 사용자 정보가 존재하지 않는 경우, '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