
해당 문제를 풀기 위해서는 이전에도 그랬던 것처럼 서버를 생성하고 문제 파일을 다운로드해야 합니다.

서버를 생성하기 버튼을 클릭하면 해당 화면이 나타납니다.

로그인 버튼을 누르면 위와 같은 화면이 나타납니다.
사용자 ID와 비밀번호를 이용하여 푸는 문제라는 것을 생각해 볼 수 있습니다.

혹시나 하여, 사용자 ID와 비밀번호에 admin을 입력해 보았습니다.

역시나 안되기에, 다운로드한 소스 코드를 찾아보기로 하였습니다.


이러한 소스 코드 파일을 볼 수 있었다.
@app. route가 총 2개 ('/') , ('/login', methods=['GET', 'POST']) 임을 알 수 있었습니다.

해당 코드를 통해 DB(datatbase)에 query문이 삽입되어 계정이 생성되었음을 볼 수 있었고, admin계정의 암호는 dict 형태로 16진수 난수 형태로 생성됨을 파악할 수 있었습니다.(binascii.hexlify : binary 데이터 16진수 표현법)
여기서 DB란 데이터베이스(영어: database, DB)로, 여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합을 의미합니다. DBMS는 데이터베이스를 관리하는 애플리케이션이며, DBMS는 관계형과 비관계형으로 나뉘게 됩니다.관계형 DBMS(RDBMS)란 행과 열의 집합인 테이블 형식으로 데이터가 저장되며, 비관계형 DBMS은 테이블 형식이 아닌 키-값(Key-Value) 형식으로 데이터 저장하는 것을 의미합니다.

또한 코드를 통해, res라는 값에는 userid와 userpassword 값이 담겨 반환된다는 것을 알 수 있습니다.
즉 admin 계정으로 로그인하여 plag 값을 얻기 위해서는, 기본적인 Injection을 통해 관리자(admin) 계정을 탈취하거나
정을 조회하는 방식이 아닌 단순히 로그인만 하면 해결할 수 있다는 것을 파악할 수 있습니다. 간단한 sql injection을 통해 로그인 우회를 실행할 수 있습니다.
여기서, SQL과 SQL Injection에 대해 살펴보자면, SQL은 RDBMS와 상호작용할 때 사용하는 언어이고 SQL Injection는 이용자가 SQL 구문에 임의의 문자열을 삽입하는 행위에 해당합니다.
서버로 돌아가서, 관리자인 admin 계정으로 로그인을 하고자 하였습니다.그런데, 위에서 알 수 있듯이 일반적으로 userid, password에 admin을 입력하면 로그인이 되지 않습니다.또한 admin의 계정의 암호는 random 값이므로 서비스 이용자인 우리는 알 수 없습니다.
그렇기에, admin 계정으로 로그인하는 코드를 생성해 보았습니다.
생성전에 참고할 코드 첫 번째는, SQL 쿼리 문입니다.

SQL 쿼리를 해석해보면, users 테이블에 입력한 uesr id와 userpassword가 일치하는 데이터를 조회한다는 사실을 알 수 있었습니다.
우리는 이미 admin계정의 userid 값이 admin인 것을 알고 있기에, 그러므로 SQL 문의 주석 처리 문법인 -- 을 통해 ID 검색 조건만을 처리하도록 두고 뒤의 usepassword 조회 부분은 주석 처리해 버리면 참 값이 생성되며 우리가 원하는 결과를 얻을 수 있다는 사실을 발견하였습니다.
그렇기에

userid에 admin 계정 그리고 "-- 주석처리 문을 넣어주어 admin"-- 으로 로그인을 시도하였습니다.
이렇게 되면 쿼리문은 참 값으로 판정이 되기에, admin 계정으로 로그인되어 flag가 출력되는 것을 확인할 수 있습니다.

해당 flag를 복사하여 정답칸에 입력하면
문제 풀이 완-료 !
'Dreamhack' 카테고리의 다른 글
| [Dreamhack_web 문제 풀이_command-injection-1] (0) | 2023.11.18 |
|---|---|
| [Dreamhack 문제 풀이] _ Mango (0) | 2023.11.10 |
| [Dreamhack 문제 풀이] _ CSRF 2 (0) | 2023.11.10 |
| [Dreamhack 문제 풀이] _ CSRF 1 (0) | 2023.11.07 |
| [Dreamhack 문제 풀이] _ xss-2 (0) | 2023.09.24 |