상세 컨텐츠

본문 제목

Segfault CTF - (5주 차) Login Bypass 1

컴퓨터/보안 - CTF문제

by 디멘터 2024. 5. 21. 00:25

본문

※ 주의 : 보안 관련 학습은 자유이지만, 학습 내용을 사용한 경우 법적 책임은 행위자에게 있습니다.
(Note: Security-related learning is allowed, but the individual is solely responsible for any legal consequences arising from the use of the acquired knowledge.)

※ CTF - Capture The Flag

※ 문제 푸는 방법이 다양할 수도 있습니다.


SegFault CTF - Login Bypass 1

 

1. 주어진 정보 : 계정 하나 (ID / PW : doldol / dol1234), 목표는 normaltic1 계정으로 로그인 하기.

 

2. 정상 로그인해서 과정 살펴보기.

→ Burp Suite로 보았으나 특별한 점은 보이지 않았다.

 

3. 방법 구상하기

SQL인젝션을 시도해 본다.

입력란에 작은따옴표, 큰따옴표, #이나 -- 같은 주석을 넣어보고 다른 반응이 없는가 살펴본다.

 

ID란에 doldol'#를 입력하고 PW란에 dol1234를 입력하니 로그인이 된다.

ID란에 doldol을 입력하고 PW란에 dol1234'#를 입력하니 로그인이 된다.

ID란, PW란 모두 SQL인젝션이 되는 웹페이지이다.

 

SQL 인젝션 시도

 

ID란에 doldol' or true#와 PW에 아무거나 넣고 들어가보니 로그인이 된다. (true 대신 '1'='1'을 써도 된다.)

doldol'#에 PW에 1을 넣으니 로그인이 안된다.

doldol' and true#에 PW에 1을 넣으니 로그인이 안된다.

식별과 인증이 동시도 아니고, 분리도 아니다. 뭔지 정확히 잘 모르겠다.

→ 동시라면 doldol'# 로 PW 1로 로그인이 되어야 한다.

→ 동시인 경우, select * from table이름 where id='doldol'# and pass='PW'; 이기 때문에 뒷 부분이 주석처리되어 doldol만 리턴되고 PW에 상관 없이 로그인이 되어야 한다.

→ 동시라면 doldol' or true# 인 경우도 PW에 상관없이 로그인 되는 것이 말이 안된다.

분리라면 PW에 아무 값이나 넣었을 때 로그인이 되면 안된다.

→ 동시 기반에 뒷 구조가 조금 복잡한 듯한 느낌이다.

→ 곰곰히 생각해보니 동시 기반의 개행이다.

→ ⓐselect * from table이름 where id='ID값'

 ⓑand pass='PW값';  이러면 id 뒤의 #이 안통하는 것이 이해되고, 모든게 말이 된다.

→ phpmyadmin에서 테스트를 해보니 

 

연습결과 개행이 확실하다. 모든 의문이 풀렸다.

 

 개행의 특이점은 2줄로 되어있어서, 한 줄로 생각했을 때 #이라는 주석이 되는 것 같기도 하고 안되는 것 같기도 한 아리송한 특징을 갖고 있다.

 다시말해, ID 끝에 #을 붙이는 것은 주석으로 처리는 하지만, PW에 영향을 주지 못한다.

 

ID란에 normaltic1' or true#을 넣고, PW란에 아무거나 넣고 로그인을 시도해보자.

 

4.성공

 

5. 조금 더 생각해보기

 

개행이다. 그렇다면 ID란에 normaltic1을 넣고, PW에 1' or '1 을 넣어서 항상 참이 되게하면 될 것 같다.

하지만, 연산자 우선순위 때문에 2번재 줄 and 가 먼저 연산을 하기 때문에 원하는 값이 나오지 않는다.

→ ID란에 normaltic1 PW란에 1' or true#을 넣으면 login_acc로 로그인 된다.

→ ID란에 normaltic1 PW란에 1' or true order by 1 desc#을 넣으면 normaltic5로 로그인 된다.

→ PW단에서만 뚫는 것은 어려워 보인다. 괄호로 연산자 우선 순위에 변경을 준다고 하더라도, 쿼리 2번째 줄 제일 처음 나오는 and를 건드릴 수 없고 and가 연산자 우선순위가 높기 때문이다.

→ and가 or 보다 연산자 우선 순위가 높다는 것을 알아야 한다.

관련글 더보기