DreamHack

simple_sqli_chatgpt

흑조롱이 2023. 9. 19. 06:56

https://dreamhack.io/wargame/challenges/769

 

simple_sqli_chatgpt

어딘가 이상한 로그인 서비스입니다. SQL INJECTION 취약점을 통해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. chatGPT와 함께 풀어보세요! Reference Server-side Basic

dreamhack.io

 

 

 

 

이 문제는 SQL 인젝션 문제이다.

 

 

서버의 소스코드를 살펴보면서 그 이유를 살펴보도록 하자.

 

 

 

SQL 구문(빨간 밑줄)

 

 

 

웹페이지는 물론, 서버에서도 사용자가 입력하는 값(userlevel)을 필터링을 안하고 있다.

 

 

userlevel에 SQL 구문을 넣어서 userlevel을 0으로 만들면, admin으로 로그인 할 수 있을 것 같다.

 

 

 

첫 시도

 

 

 

 

 

 

예상과 달리, admin대신 guest로 로그인 한 것 같다.

 

 

guest 또한 userlevel이 admin과 동일한 0인 것으로 보인다.

 

 

이는 SQL 구문을 넣을 때, userid를 지정하지 않아서 발생한 문제인 것 같다.

 

 

 

 

 

 

그래서 이번에는 다른 방식으로 갔다.

 

 

 

1) 기존의 SQL 구문 뒤에 UNION을 붙여서, 우리가 원하는 쿼리문이 실행되도록 하자.

 

 

2) userid가 admin이고, userlevel이 '0'인 사용자(admin)를 선택하도록 한다.

 

 

3) 남아있을 따옴표(')를 무시하기 위해 --로 주석 처리를 해주자.

 

 

 

위의 방식대로 쿼리문을 만들면 아래와 같다.

 

' union select * from users where userid='admin' and userlevel='0'-- 넣을 쿼리문

 

 

 

 

마지막으로, 위에서 만든 쿼리문을 실제로 넣어보자.

 

 

 

쿼리문을 넣은 모습

 

 

 

서버에서 처리할 SQL 쿼리문은 다음과 같이 변하게 된다.

 

 

select * from users where userlevel='' union select * from users where userid='admin' and userlevel='0'--'

 

 

union으로 우리가 원하는 쿼리문(admin을 선택하는 쿼리문)을 실행시킬 수 있다.

 

 

그러면 플래그를 받아올 수 있다!

 

 

 

flag가 나오는 모습