W3B H4CK1NG

[dreamhack] simple sqli

hauni 2024. 10. 4. 16:37

상단 바에 Home, About, Contact가 있지만 실제 페이지는 Login만 존재

 

 

데이터베이스 파일명을 database.db로 설정

userid, userpassword가 각각 guest, guest인데 admin의 경우에는

{binascii.hexlify(os.urandom(16)).decode(“utf8”)}: 랜덤 16바이트 문자열을 16진수로 표현하도록 되어있다.

 

 

POST 메소드 요청 전달한 경우, users 테이블에서 입력한 useriduserpassword가 일치하는 정보를 불러온다.

존재하면 로그인할 계정을 해당 쿼리 결과에서 불러와 사용하고 존재하지 않으면 wrong 메시지 출력

로그인하는 계정이 관리자 계정이면 flag 출력, 아니면 hello 출력

 

해결 방법 - SQL injection

 

useriduserpassword 입력 받고 동적으로 쿼리를 생성한 후 query_db 함수에서 SQLite에 질의

동적으로 생성한 쿼리: Rawquery

Rawquery 생성할 때 이용자의 입력값이 쿼리문에 포함되면 injection 취약점에 노출될 수 있다.

 

 

userid 검색 조건만 받아들일 수 있도록 패스워드 부분은 주석 처리하는 방식

 

SELECT * FROM users WHERE userid="{userid}" AND userpassword="{userpassword}"; → 로그인 쿼리

SELECT * FROM users WHERE userid=admin”-- AND userpassword=”1234(아무거나)"; →패스워드 부분 주석 처리