Almon Dev

ctf 풀이 (admin is mine) 본문

웹 해킹/웹 해킹(ctf)

ctf 풀이 (admin is mine)

Almon 2024. 11. 19. 12:50

ctf 문제 풀이

 

admin is mine

 

풀이

1> doldol / dol1234 로그인해 보기

 => loginProc.php에 get메서드로 아이디와 비밀번호를 전달

 => 로그인에 성공하면 {result: 'ok'}를 응답하고 index.php로 이동

 

2> index.php에 접근해 보기

자바스크립트로 login.php로 리다이렉트 시키는 것이 보입니다.

그리고 그 밑에 html코드가 그대로 노출되네요.

 

3> js 확인해 보기

서버에서는 결괏값으로 {result: "ok/fail"}를 응답하고 있습니다.

그렇다면 클라이언트 측에서 로그인에 성공했을 때 리다이렉트를 시켜주는 자바스크립트 코드가 있어야 합니다.

 

4> 로그인 로직 추측

1. 아이디와 비밀번호를 get으로 받아옵니다.
2. 서버에서 아이디와 비밀번호를 검사합니다.
3. 검사에 성공하면 index.php의 location.href부분을 제거합니다.
4. result: "ok"를 응답받은 클라이언트에서 js로 index.php로 리다이렉트 시킵니다.
4. 검사에 실패하면 실패 메시지를 띄웁니다.

로그인에 실패하든 성공하든 index.php의 내용은 만들어지는 걸로 보입니다.

 

5> admin계정으로 로그인 실패하기

결과인 result: "fail"을 받았습니다.

 

6> index.php에 접근하기

리다이렉트를 시키더라도 html코드가 그대로 노출되기에 플래그가 보입니다.

 

7> admin 계정으로 로그인 페이지 띄워보기

1. doldol/dol1234 계정으로 로그인을 합니다.
2. result: "ok"를 받은 웹서버가 어딘가(ex) 세션) 상태를 저장합니다.
3. 버프스위터로 admin/1을 요청을 보내 index.php를 완성합니다.
4. 새로고침합니다.
=> 아마도 result: "ok"시 script를 제거하는 코드를 넣고, fail일시 아무것도 하지 않아서 생기는 문제인 것 같습니다.

로그인 php 코드 예상

login.php

<?php
session_start();
$input_id = $_GET['UserId'];
$input_pass = $_GET['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' and password='$_input_pass'";
$result = $conn->query($sql)->fetch_array(); // 첫번째 결과(row)를 받아옴

$nickname = $result['nickname'];
$_SESSION['nickname'] = $nickname;

if($input_pass == $db_pass) {
    // 로그인 성공
    $_SESSION['result'] = "ok";
    echo json_encode(["result" => "ok"]);
}else {
    // 로그인 실패
    echo json_encode(["result" => "fail"]);
}

 

index.php

<?php
session_start();
$result = $_SESSION['result'] ?? null;
if(!$result = 'ok') {
    echo "<script>location.href='login.php'</script>";
}

?>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>닉네임은? <?=$_SESSION['nickname'] ?></p>
</body>
</html>

 

'웹 해킹 > 웹 해킹(ctf)' 카테고리의 다른 글

ctf 풀이 (SQL Injection 1)  (0) 2024.11.23
ctf 풀이 (Pin Code Crack)  (2) 2024.11.20
ctf 풀이 (Secret Login)  (2) 2024.11.18
ctf 풀이 (Login Bypass 4)  (0) 2024.11.18
ctf 풀이 (Login Bypass 3)  (0) 2024.11.16