
이번 문제는 관리자 계정으로 로그인을 하는 것인데 관리자 아이디를 모른다.

일단 주어진 아이디로 http history를 확인해 봤다.

이전 문제들과 요청하는 게 다른 게 없다.

POST로 요청하고 GET 메서드로 index.php를 응답받는다.

마찬가지로 doldol 아이디로 로그인 됐다.

보통 admin 계정은 처음 로그인 로직을 구현하고 DB를 연동시킬 때 가장 처음에 추가하게 된다. 따라서 다른 row의 아이디로 로그인을 시도할 수 있는지 확인해 봤다. 먼저 로그인 로직이 식별/인증 동시라고 가정하고 doldol 또는 Ture(1=1) -> 테이블의 모든 값을 가져오게 했다.
select * from member where UserId='doldol' or 1=1 # ' and Password='아무거나 입력'
실제 서버는 위 쿼리가 작동한다고 예측했다.

login_acc가 나왔다. 즉, login_acc라는 아이디로 로그인이 됐고, 이를 통해 아이디 테이블 전체를 가져올 수 있는 것을 알 수 있다. 그럼 해당 sql injection 방법이 작동했으니까 가장 첫 번째 아이디로 로그인하려면 어떡해야 할까? sql에서는 limit이라는 함수가 있다.
SELECT * FROM user WHERE age>20 limit 0,1;
해당 쿼리를 해석해 보면 user라는 테이블에서 age가 20보다 큰 모든 데이터 중 0번째 행부터 1개를 출력한다라고 해석할 수 있다. 즉, limit 함수를 사용하면 사용자가 원하는 row의 데이터를 가져올 수 있다. 이를 응용해 보면?

전체 테이블 중 첫 번째 행을 가져오기 위해 위처럼 작성하면
select * from member where UserId='doldol' or 1=1 limit 1,1 # ' and Password='아무거나 입력'
이렇게 서버에서 쿼리가 실행될 것이고, 해석해 보면 userId가 'doldol' 또는 전체 테이블(1=1) 중에서 전체 테이블을 가져오게 되고 첫 번째 행(limit 1,1)으로 로그인 시도를 한다라고 해석할 수 있다. 이때도 식별/인증 동시이며 개행문이 아니기 때문에 작동하는 것을 알 수 있다. 원래라면 식별/인증 분리인지 동시인지 테스트해보고, 개행문인지까지도 확인해야 하지만 첫 시도만에 됐으니 다행이다.

두둥탁! 관리자 계정으로 로그인이 성공했다.

만약, 두 번째 row로 로그인하고 싶다면? 아이디를 위와 같이 작성하면
select * from member where UserId='doldol' or 1=1 limit 2,1 # ' and Password='아무거나 입력'
해당 쿼리가 실행될 것이고, limit 2,1이 2번째 행부터 1개의 데이터로 제한시키기 때문에 두 번째 행의 아이디로 로그인할 수 있다.

두 번째 row의 아이디는 bello라는 것을 알 수 있다.
summary
이번에는 limit 함수를 사용해서 원하는 행을 불러올 수 있는 방법을 진행했고, 테이블의 전체 데이터를 불러와 확인할 수 있는지 확인했다. 추가로 limit 2,5를 하든 limit 2,1을 하든 데이터를 여러 개 가지고 오더라도 화면에 출력되는 것은 User Name 하나기 때문에 맨 위의 데이터 즉, 가장 처음 데이터가 선택되는 것도 알아두면 좋을 것 같다.
'NS > CTF' 카테고리의 다른 글
| [Week6/CTF] - SQL Injection 1 (0) | 2024.06.18 |
|---|---|
| [Week5/CTF] PIN CODE Bypass (2) | 2024.05.22 |
| [Week5/CTF] Get Admin (2) | 2024.05.22 |
| [Week5/CTF] Login Bypass 1,2 (1) | 2024.05.22 |
| [Week4] Burp Suite - CTF(간단 퀴즈) (0) | 2024.05.13 |