※ CTF - Capture The Flag
※ 문제 푸는 방법이 다양할 수도 있습니다.
1. 주어진 정보 : 계정 하나 (ID / PW : doldol / dol1234), 목표는 normaltic1 계정으로 로그인 하기.
2. 정상 로그인해서 과정 살펴보기.
→ Burp Suite로 보았으나 특별한 점은 보이지 않았다.
3. 방법 구상하기
→ SQL인젝션을 시도해 본다.
→ 입력란에 작은따옴표, 큰따옴표, #이나 -- 같은 주석을 넣어보고 다른 반응이 없는가 살펴본다.
→ ID란에 doldol'#를 입력하고 PW란에 dol1234를 입력하니 로그인이 된다.
→ ID란에 doldol을 입력하고 PW란에 dol1234'#를 입력하니 로그인이 된다.
→ ID란, PW란 모두 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 보다 연산자 우선 순위가 높다는 것을 알아야 한다.
Segfault CTF - (5주 차) Login Bypass 3 (0) | 2024.05.21 |
---|---|
Segfault CTF - (5주 차) Login Bypass 2 (1) | 2024.05.21 |
Segfault CTF - (5주 차) Pin Code Crack (1) | 2024.05.20 |
Segfault CTF - (5주 차) Admin is Mine (0) | 2024.05.20 |
Segfault CTF - (5주 차) PIN CODE Bypass (0) | 2024.05.20 |