Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

White Security

neverlanctf 2019 - Dirty Validate writeup 본문

CTF Writups

neverlanctf 2019 - Dirty Validate writeup

POSIX 2019. 2. 4. 18:40


자바스크립트로 유저를 인증하도록 했다 합니다.

링크가 하나 주어지네요.



링크에 접속하면

로그인 폼이 하나 보입니다.


	  // reference here
	  // https://api.jquery.com/jQuery.ajax/
      // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/atob

      // For element with id='name', when a key is pressed run this function
      $('#name').on('keypress',function(){
        // get the value that is in element with id='name'
        var that = $('#name');
		// make an ajax request to get the expected username
        $.ajax('webhooks/get_username.php',{})
		.done(function(data)
		{ // once the request has been completed, run this function
			data = JSON.parse(data);
            if( data.usernames.indexOf(that.val()) != -1 ){ // see if the username is in the list
 
              that.css('border', '1px solid green'); // if it matches turn the border green
              $('#output').html('Username is correct'); // state that the user was correct

            }else{ // if the user typed in something incorrect

              that.css('border', ''); // set input box border to default color
              $('#output').html('Username is incorrect'); // say the user was incorrect

            }

          }
        );
      });

      // For the password input now
	  // This is a BAD idea, never validate sensitive data in javascript
      $('#pass').on('keypress', function(){
		// get value for element with id='pass'
        var that = $('#pass');
		// make an ajax request to get the expected password for the given username
        $.ajax('webhooks/get_password.php?user='+encodeURIComponent($('#name').val()),{})
		.done(function(data)
		{// once the request has completed, run this function
			// remove whitespace from data
            data = data.replace(/(\r\n|\n|\r)/gm,"");
			// check if the data matches the given value
            if(window.atob(data) == that.val()){

			  // if value is correct, show a green border
			  that.css('border', '1px solid green');
			  $('#output').html(window.atob(data));

            }else{

			  // if value is false, remove border
              that.css('border', '');
              $('#output').html('Password is incorrect');

			}

          }
        );
      });


소스를 살펴보면


먼저 아이디를

webhooks/get_username.php 페이지에 있는지 확인하고


이후 패스워드를

webhook/get_password.php?user= 에서 점검하여

유효하다면

base64 복호화 한 후, 화면에 출력하도록 되어 있군요.


https://challenges.neverlanctf.com:1135/webhooks/get_username.php


따라서 webhooks/get_username.php 에 접속하면

모든 유저 목록을 조회할 수 있었습니다.


https://challenges.neverlanctf.com:1135/webhooks/get_password.php?user=Dr. Whom


또한 webhooks/get_password.php 페이지에서

username을 인자로 비밀번호까지 조회할 수 있는데


Dr. Whom 의 비밀번호 데이터를

복호화 하니, 플래그를 얻을 수 있었습니다.


flag{D0n't_7rus7_JS}




Comments