hacking : p_study/webhack

7주차_CTF과제(suninatas : web 1번문제)

JU__DY 2024. 5. 25. 13:55

http://suninatas.com/challenge/web01/web01.asp

 

Game 01

<%    str = Request("str")    If not str = "" Then        result = Replace(str,"a","aad")        result = Replace(result,"i","in")        result1 = Mid(result,2,2)        result2 = Mid(result,4,6)  

suninatas.com

 

 

해당문제는 요즘 배우는 웹프로그래밍을 연상시키는 생김새였다.

일단 해당코드를 봤을 때,

str을 "" 시작으로, result값에 대입을 하고 값을 찾아내고, 최종 pw값을 도출해내는 것 같았다.

 

해당문제는 "" 값을 admin으로 주고(역으로) ,  pw를 구하라는 것 같았는데, a를 aad로 대체함으로 , aaddmin으로 바뀌고, 그리고 result 값의 i를 in으로 바꿔 최종적으로 result는 aaddminn으로 바꾸는 방법을 생각해봤다.

 

그리고 result1 은 Mid(result,2,2)를 통해 dd라는 것을 알 수 있고, result2는 Mid(result4,6)을 통해 ?? 인것을 알 수 있다.

result는 최종적으로 result1 & reslut2 값이 대입된다. 

 

근데 위에 ??에서 느낄 수 있듯 여기서부터 풀이 방법이 잘못됨을 느꼈다.

 

그래서 방법을 다시 결과가 위에 과정을 거쳐서 admin으로 귀결되기 위해 첫 str이 무엇이었을지를 고민해봐야하는 것인 것 같다.

 

<?php

function generatePassword($length) {
    $characters = '0123456789abcdef';
    $charactersLength = strlen($characters);
    $pw = '';
    for ($i = 0; $i < $length; $i++) {
        $pw .= $characters[random_int(0, $charactersLength - 1)];
    }
    return $pw;
}

function generateOTP() {
    return 'P' . str_pad(strval(random_int(0, 999999)), 6, "0", STR_PAD_LEFT);
}

$admin_pw = generatePassword(32);
$otp = generateOTP();

function login() {
    if (!isset($_POST['cred'])) {
        echo "Please login...";
        return;
    }

    if (!($cred = base64_decode($_POST['cred']))) {
        echo "Cred error";
        return;
    }

    if (!($cred = json_decode($cred, true))) {
        echo "Cred error";
        return;
    }

    if (!(isset($cred['id']) && isset($cred['pw']) && isset($cred['otp']))) {
        echo "Cred error";
        return;
    }

    if ($cred['id'] != 'admin') {
        echo "Hello," . $cred['id'];
        return;
    }
    
    if ($cred['otp'] != $GLOBALS['otp']) {
        echo "OTP fail";
        return;
    }

    if (!strcmp($cred['pw'], $GLOBALS['admin_pw'])) {
        require_once('flag.php');
        echo "Hello, admin! get the flag: " . $flag;
        return;
    }

    echo "Password fail";
    return;
}

?>

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>Easy Login</title>
</head>
<body>
    <div class="login-container">
        <h2>Login as admin to get flag<h2>
        <form action="login.php" method="post">
            <div class="form-group">
                <label for="id">ID</label>
                <input type="text" name="id"></br>
            </div>
            <div class="form-group">
                <label for="pw">PW</label>
                <input type="text" name="pw"></br>
            </div>
            <div class="form-group">
                <label for="otp">OTP</label>
                <input type="text" name="otp"></br>
            </div>
            <button type="submit" class="button">Login</button>
        </form>
        <div class="message">
            <?php login(); ?>
        </div>
    </div>
</body>
</html>

 

다 비슷비슷하게 생긴거같다..

 

어쨋든 거꾸로 admin을 만들기위해서 , 일단 a가 있으면 add로 바뀐다는 점으로 a는 있을 것이고,

i가 있을 경우, in으로 바뀐다는 부분에서 i도 있을 것이다. 

a와 i가 있을 경우 일단, addin인데, 아래 내용도 사용해야한다.

 

 

그렇게 나온 값이 ami 이다.

 

 

근데 이문제, 작년 웹해킹 시간에 풀어본 적이 있는 것 같다는 걸 거의 다 고민한 후에 생각이 났다.

흠.. 드림핵문제처럼 문제를 통한 힌트가 없지만, 문제자체는 1번 문제라 그런지 훨씬 직관적이고 간단하게 느껴졌다.

웹해킹을 공부한지 거의 2학기가 되어가는데 , 아직 너무 부족한 부분이 많은 것 같다.

공부를 더 제대로 해야겠다는 생각이 들었다.

 

CTF 과제 끝

 

 

[ 참고 학습 자료 ]

https://tutoreducto.tistory.com/156

 

[SuNiNaTas] 써니나타스 1번 - WEB

URL은 다음과 같다. http://suninatas.com/challenge/web01/web01.asp Game 01

tutoreducto.tistory.com

해당 블로그는 역연산하는 것을 알고리즘으로 짠것이 인상적이라 가져와봤다.

이런식으로 풀면 더 어려운 문제도 정확하게 풀 수 있을 것같다.