문제에서 제공해주는 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 |