문제에서 제공해주는 app.py 플라스크 코드를 보면 간단하게 DB를 생성하는 부분과 로그인 하는 부분으로 구분되어 있는 것을 알 수 있다.

DB를 생성하는 부분은 guest/guest 계정과 admin/os.urandom(16) 계정을 만들며,
로그인 부분에서는 사용자로부터 id와 password를 입력받아 쿼리를 보낸다. 하지만 사용자로부터 받은 입력 값에 대한 검증이 없기 때문에 sql injeciton을 허용한다.

해당 어플리케이션에서 사용한 DB는 sqlite3로 주석으로 -- 를 사용한다.
즉 사용자의 계정에 admin을 넣고 그 뒤를 주석 처리해 버리면 된다.

상세 과정

select * from users where userid="{userid}" and userpassword="{userpassword}"

쿼리는 사용자로부터 입력 받은 값들을 그대로 사용하게 된다.

admin” -- 를 id 부분에 넣고, 비밀번호 부분에는 아무것이나 넣어주면(e.g., 1234) 쿼리는 다음과 같이 된다.

select * from users where userid="admin" -- and userpassword="1234"

그러면 주석 뒤 부분은 무시가 되기 때문에 아래와 같은 쿼리가 된다.

select * from users where userid="admin"

즉 admin에 대한 계정을 조회하는 쿼리가 되는 것이다.
따라서 admin 계정의 비밀번호를 모르더라도 로그인 할 수 있게 된다.

'0x40 Web Hacking' 카테고리의 다른 글

Dreamhack :: devtools-sources  (0) 2022.05.17
Dreamhack :: session-basic  (0) 2022.05.17
Dreamhack :: Carve Party  (0) 2022.05.17
Dreamhack :: simple-ssti  (0) 2022.05.17

+ Recent posts