이 도구를 이용하여 허용받지 않은 서비스 대상으로 해킹을 시도하는 행위는 범죄 행위입니다. 해킹을 시도할 때에 발생하는 법적인 책임은 그것을 행한 사용자에게 있다는 것을 명심하시기 바랍니다.
인증 결함(Broken Authentication)이란 인증에 필요한 사용자의 계정 정보를 노출하는 취약점으로 보통 웹 페이지의 HTML 코드에 계정 정보를 노출하거나 인증을 GET 메서드로 요청하여 URL에 계정 정보가 노출되기도 합니다. 웹 사이트 가입 시 추측할 수 있거나 무차별 대입 공격이 가능한 비밀번호(예 1234, admin 등) 입력을 허용하는 경우도 포함됩니다. 이외에도 비밀번호 찾기 기능에서 사용자의 계정 정보를 노출하기도 합니다.
A2 - Broken Auth. - Insecure Login Forms (안전하지 않은 로그인 형식)
'ba_insecure_login_1.php' 페이지에서는 웹 페이지가 안전하지 않은 로그인 형식을 사용하는지 점검합니다.
먼저 해당 페이지를 마우스로 드래그하였을 때 Login, Password가 노출되는 것을 확인할 수 있습니다.
'ba_insecure_login_1.php' 페이지의 소스 코드를 웹 브라우저 개발자 도구로 확인합니다. (웹브라우저 개발자 도구는 F12 기능키를 눌러 실행을 하거나, 크롬의 경우 Ctrl + Shift + I를 통하여 확인이 가능합니다.) 소스코드 내 'main' 안에서 POST 메서드로 전송하는 로그인 형식을 찾으면 'login'이라는 레이블 밑에 흰색으로 지정한 태그를 확인할 수 있습니다.
<div id="main">
<h1>Broken Auth. - Insecure Login Forms</h1>
<p>Enter your credentials.</p>
<form action="<?php echo($_SERVER["SCRIPT_NAME"]);?>" method="POST">
<p><label for="login">Login:</label><font color="white">tonystark</font><br />
<input type="text" id="login" name="login" size="20" /></p>
<p><label for="password">Password:</label><font color="white">I am Iron Man</font><br />
<input type="password" id="password" name="password" size="20" /></p>
<button type="submit" name="form" value="submit">Login</button>
</form>
</br >
<?php echo $message;?>
</div>
태그를 클릭하여 'black'으로 바꾸면 페이지의 로그인 레이블 옆에 글자가 나타나는 것을 확인할 수 있습니다.
아이디와 비밀번호 레이블 옆에 나타난 글자를 각각 입력하면 로그인에 성공한 화면을 확인할수 있습니다.
난이도 중
난이도 중에서는 난이도 하와는 다르게 Name 칸에 이미 'brucebanner'가 입력되어 있고, 해당 사용자로 로그인하기 위하여 웹 페이지의 취약한 부분을 찾아보도록 하겠습니다.
<div id="main">
<h1>Broken Auth. - Insecure Login Forms</h1>
<p>Enter the correct passphrase to unlock the secret.</p>
<form>
<p><label for="name">Name:</label><font color="white">brucebanner</font><br />
<input type="text" id="name" name="name" size="20" value="brucebanner" /></p>
<p><label for="passphrase">Passphrase:</label><br />
<input type="password" id="passphrase" name="passphrase" size="20" /></p>
<input type="button" name="button" value="Unlock" onclick="unlock_secret()" /><br />
</form>
</br >
<?php echo $message;?>
</div>
ba_insecure_login_2.php 페이지의 소스 코드를 웹 브라우저 개발자 도구를 통하여 확인 합니다. 아이디는 노출하지만 비밀번호는 노출하지 않습니다. 변수 명은 'passphrase'이고 'Unlock' 버튼을 클릭하면 'unlock_secret' 함수를 호출하는 것을 확인할 수 있습니다.
소스 코드에 비밀번호와 관련된 정보가 있는지 더 찾아 보도록 하겠습니다. 웹 페이지에서 우클릭하여 '소스 코드 보기' 메뉴를 선택하고 찾기를 통하여 비밀번호 입력 값을 저장하는 변수 명 'passphrase'를 검색합니다. passphrase와 secret 변수의 값이 일치하는 경우 로그인에 성공하는 조건문이 보입니다.
function unlock_secret()
{
var bWAPP = "bash update killed my shells!"
var a = bWAPP.charAt(0); var d = bWAPP.charAt(3); var r = bWAPP.charAt(16);
var b = bWAPP.charAt(1); var e = bWAPP.charAt(4); var j = bWAPP.charAt(9);
var c = bWAPP.charAt(2); var f = bWAPP.charAt(5); var g = bWAPP.charAt(4);
var j = bWAPP.charAt(9); var h = bWAPP.charAt(6); var l = bWAPP.charAt(11);
var g = bWAPP.charAt(4); var i = bWAPP.charAt(7); var x = bWAPP.charAt(4);
var l = bWAPP.charAt(11); var p = bWAPP.charAt(23); var m = bWAPP.charAt(4);
var s = bWAPP.charAt(17); var k = bWAPP.charAt(10); var d = bWAPP.charAt(23);
var t = bWAPP.charAt(2); var n = bWAPP.charAt(12); var e = bWAPP.charAt(4);
var a = bWAPP.charAt(1); var o = bWAPP.charAt(13); var f = bWAPP.charAt(5);
var b = bWAPP.charAt(1); var q = bWAPP.charAt(15); var h = bWAPP.charAt(9);
var c = bWAPP.charAt(2); var h = bWAPP.charAt(2); var i = bWAPP.charAt(7);
var j = bWAPP.charAt(5); var i = bWAPP.charAt(7); var y = bWAPP.charAt(22);
var g = bWAPP.charAt(1); var p = bWAPP.charAt(4); var p = bWAPP.charAt(28);
var l = bWAPP.charAt(11); var k = bWAPP.charAt(14);
var q = bWAPP.charAt(12); var n = bWAPP.charAt(12);
var m = bWAPP.charAt(4); var o = bWAPP.charAt(19);
var secret = (d + "" + j + "" + k + "" + q + "" + x + "" + t + "" +o + "" + g + "" + h + "" + d + "" + p);
if(document.forms[0].passphrase.value == secret)
{
// Unlocked
location.href="<?php echo($_SERVER["SCRIPT_NAME"]); ?>?secret=" + secret;
}
else
{
// Locked
location.href="<?php echo($_SERVER["SCRIPT_NAME"]); ?>?secret=";
}
}
조건문 위의 secret 변수에 '(d + "" + j + "" + k + "" + q + "" + x + "" + t + "" +o + "" + g + "" + h + "" + d + "" + p)'라는 이상한 문자열이 대입되어 있습니다. 소스 코드를 위에서부터 확인하면 조건문과 secret 변수는 unlock_secret 함수 안에 정의되어 있고, unlock_secret 함수는 charAt 함수를 호출합니다. charAt 함수는 문자열 객체에서 문자 하나만 반환하는 함수로, 정수를 인자로 받아 해당하는 순서의 문자를 출력합니다. 순서는 0부터 시작합니다.
즉, secret 변수에 대입된 값은 문자가 아닌 var 타입으로 선언된 변수라는 것을 확인할 수 있습니다. 같은 변수 명이 여러 번 등장하는 것으로 보아 변수에 입력한 값을 계속 덮어 쓰고 있고, 가장 마지막에 선언된 변수에 해당하는 값으로 원래 secret 내용을 찾는다는 것을 알수 있습니다.
secret 변수의 첫 번째 값인 d는 charAt (23), 즉 bWAPP 문자열의 24번째에 존재하는 문자로 h라는 것을 확인 할수 있습니다.
var bWAPP = "bash update killed my shells!"
* chatAt() 함수는 문자열(string) 객체의 함수로, 인자로 주어진 인덱스에 위치한 문자를 반환합니다.
이어서 j, k, q, x, t, o, g, h, d , p 도 차례대로 찾아서 반환하는 값을 확인합니다.
위처럼 값을 조합해서 secret 변수의 값을 알아낼 수도 있지만, 개발자 도구의 console 기능을 통해 쉽게 알나 낼 수도 있습니다.
개발자 도구를 열어 Console 창을 누르고 소스코드를 복사하여 붙여 넣기 한 후 엔터키를 눌러 입력화면에 bWAPP, secret 값을 입력한 후 패스워드를 확인합니다.
대응방안
<div id="main">
<h1>Broken Auth. - Insecure Login Forms</h1>
<p>Enter your credentials.</p>
<form action="<?php echo($_SERVER["SCRIPT_NAME"]); ?>" method="POST">
<p><label for="login">Login:</label><br />
<input type="text" id="login" name="login" size="20" /></p>
<p><label for="password">Password:</label><br />
<input type="password" id="password" name="password" size="20" /></p>
<button type="submit" name="form" value="submit">Login</button>
</form>
</br >
<?php echo $message;?>
</div>
난이도 상에서는 'ba_insecure_login_3.php 페이지를 호출합니다. 또한, 웹 브라우저 개발자 도구로 페이지를 확인하면 이전 단계와는 다르게 흰색으로 숨겨놓은 태그도 보이지 않습니다.
if(isset($_POST["form"]))
{
if($_POST["login"] == $login && $_POST["password"] == $password)
{
$message = "<font color=\"green\">Successful login!</font>";
}
else
{
$message = "<font color=\"red\">Invalid credentials!</font>";
}
}
다른 단계들은 모두 코드 안에 로그인 정보가 들어 있지만, 난이도 상에는 웹 페이지에도 PHP 소스 코드에도 아이다와 비밀 번호를 노출하지 않는 것을 확인할 수 있습니다.
'Code::Security > 비박스(BWAPP)' 카테고리의 다른 글
비박스(bWAPP) A2 Broken Auth. - Password Attacks (0) | 2022.06.21 |
---|---|
비박스(bWAPP) A2 Broken Auth. - Logout Management (0) | 2022.06.16 |
비박스(bWAPP) A2 Broken Auth. - Forgotten Function (0) | 2022.06.13 |
비박스(bWAPP) A2 - Broken Auth & Session Mgmt (인증 및 세션 관리 취약점) (0) | 2022.06.13 |
비박스(bWAPP) XML/XPath Injection (Search) (0) | 2021.08.12 |