728x90
반응형
728x90
반응형
728x90
반응형


HTML - disabled buttons


버튼이 눌리지 않는다.

f12로 페이지 소스를 본 다음, 


<input disabled="" type="submit" value="Member access" name="authbutton">


이걸


<input type="submit" value="Member access" name="authbutton">


이렇게 하면 버튼이 활성화된다.




Javascript - Authentication



페이지 소스를 보면, 사이트가 login.js에서 로그인을 처리하는 것을 알 수 있다.

login.js의 소스를 보면 아이디와 패스워드를 확인할 수 있다.




Javascript - Source



페이지 소스에서 스크립트 부분을 보면 된다.




Javascript - Authentication 2



login.js를 보면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function connexion(){
    var username = prompt("Username :", "");
    var password = prompt("Password :", "");
    var TheLists = ["GOD:HIDDEN"];
    for (i = 0; i < TheLists.length; i++)
    {
        if (TheLists[i].indexOf(username) == 0)
        {
            var TheSplit = TheLists[i].split(":");
            var TheUsername = TheSplit[0];
            var ThePassword = TheSplit[1];
            if (username == TheUsername && password == ThePassword)
            {
                alert("Vous pouvez utiliser ce mot de passe pour valider ce challenge (en majuscules) / You can use this password to validate this challenge (uppercase)");
            }
        }
        else
        {
            alert("Nope, you're a naughty hacker.")
        }
    }
}
cs

username은 GOD, password는 HIDDEN




Javascript - Obfuscation 1


1
2
3
4
5
6
7
8
9
10
11
12
13
 
              /* <![CDATA[ */
 
              pass = '%63%70%61%73%62%69%65%6e%64%75%72%70%61%73%73%77%6f%72%64';
              h = window.prompt('Entrez le mot de passe / Enter password');
              if(h == unescape(pass)) {
                  alert('Password accepté, vous pouvez valider le challenge avec ce mot de passe.\nYou an validate the challenge using this pass.');
              } else {
                  alert('Mauvais mot de passe / wrong password');
              }
 
              /* ]]> */
          
cs

페이지 소스에 있는 스크립트를 보면, pass의 값을 디코딩한 값이 패스워드가 된다.





Javascript - Obfuscation 2


빈 페이지인데 소스를 보면 스크립트에 변수 pass가 정의되어 있다.

1
var pass = unescape("unescape%28%22String.fromCharCode%2528104%252C68%252C117%252C102%252C106%252C100%252C107%252C105%252C49%252C53%252C54%2529%22%29");
cs



크롬의 콘솔을 이용해 구해주면 된다. use chrome console






Javascript - Native code



É=-~-~[],ó=-~É,Ë=É<<É,þ=Ë+~[];Ì=(ó-ó)[Û=(''+{})[É+ó]+(''+{})[ó-É]+([].ó+'')[ó-É]+(!!''+'')[ó]+({}+'')[ó+ó]+(!''+'')[ó-É]+(!''+'')[É]+(''+{})[É+ó]+({}+'')[ó+ó]+(''+{})[ó-É]+(!''+'')[ó-É]][Û];Ì(Ì((!''+'')[ó-É]+(!''+'')[ó]+(!''+'')[ó-ó]+(!''+'')[É]+((!''+''))[ó-É]+([].$+'')[ó-É]+'\''+''+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(þ)+(É+ó)+'\\'+(ó-É)+(ó+ó)+(ó-ó)+'\\'+(ó-É)+(ó+ó)+(É)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(ó-É)+(É+ó)+(É+ó)+'\\'+(ó-É)+(ó+ó)+(ó-ó)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(É+ó)+(ó-ó)+'\\'+(É+É)+(þ)+'\\'+(ó-É)+(ó-ó)+(É+ó)+'\\'+(ó-É)+(É+ó)+(ó+ó)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(ó-É)+(ó+ó)+(É)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(ó-É)+(þ)+(É)+'\\'+(É+É)+(ó-ó)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(É+É)+(ó-ó)+'\\'+(ó-É)+(É+ó)+(É+ó)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(É+É)+(ó-ó)+'\\'+(ó-É)+(É+É)+(É+É)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(É+É)+(ó-ó)+'\\'+(ó-É)+(ó+ó)+(ó-ó)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(ó-É)+(ó+ó)+(ó)+'\\'+(ó-É)+(ó+ó)+(ó)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(É+É)+(þ)+'\\'+(É+ó)+(ó-É)+'\\'+(þ)+(ó)+'\\'+(ó-É)+(É+ó)+(ó-É)+'\\'+(ó-É)+(É+É)+(ó+ó)+'\\'+(É+ó)+(ó-ó)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(þ)+(É+ó)+'\\'+(þ)+(É+ó)+'\\'+(É+É)+(þ)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(ó+ó)+(ó-É)+'\\'+(ó+ó)+(É)+'\\'+(ó+ó)+(ó)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(É+É)+(þ)+'\\'+(É+ó)+(ó-É)+'\\'+(ó-É)+(þ)+(ó)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(ó-É)+(ó+ó)+(É)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(É+ó)+(ó-ó)+'\\'+(É+É)+(þ)+'\\'+(ó-É)+(É+É)+(É)+'\\'+(ó-É)+(ó+ó)+(É)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(ó-É)+(ó+ó)+(ó+ó)+'\\'+(ó-É)+(É+ó)+(þ)+'\\'+(É+É)+(þ)+'\\'+(É+ó)+(ó-É)+'\\'+(þ)+(ó)+'\\'+(ó-É)+(þ)+(É+ó)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(ó-É)+(ó+ó)+(ó)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(ó-É)+(þ)+(ó)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(ó-É)+(É+É)+(É+ó)+'\\'+(ó-É)+(ó+ó)+(É)+'\\'+(ó-É)+(ó+ó)+(É+É)+'\\'+(É+ó)+(ó-ó)+'\\'+(É+É)+(þ)+'\\'+(ó-É)+(É+É)+(ó+ó)+'\\'+(ó-É)+(É+É)+(ó-É)+'\\'+(ó-É)+(É+ó)+(ó-É)+'\\'+(ó-É)+(É+ó)+(É+É)+'\\'+(É+ó)+(ó+ó)+'\\'+(É+ó)+(ó+ó)+'\\'+(É+ó)+(ó+ó)+'\\'+(É+É)+(þ)+'\\'+(É+ó)+(ó-É)+'\\'+(þ)+(ó)+'\\'+(ó-É)+(þ)+(É+ó)+'\'')())()


난독화된 js 코드가 있다.


크롬 콘솔을 이용하자. 끝에 ()를 지워주고 .toString()을 사용하면 복호화된 코드를 얻을 수 있다.




Javascript - Obfuscation 3


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
function dechiffre(pass_enc) {
    var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
    var tab = pass_enc.split(',');
    var tab2 = pass.split(',');
    var i, j, k, l = 0,
        m, n, o, p = "";
    i = 0;
    j = tab.length;
    k = j + (l) + (n = 0);
    n = tab2.length;
    for (i = (o = 0); i < (k = j = n); i++) {
        o = tab[i - l];
        p += String.fromCharCode((o = tab2[i]));
        if (i == 5break;
    }
    for (i = (o = 0); i < (k = j = n); i++) {
        o = tab[i - l];
        if (i > 5 && i < k - 1)
            p += String.fromCharCode((o = tab2[i]));
    }
    p += String.fromCharCode(tab2[17]);
    pass = p;
    return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
 
= window.prompt('Entrez le mot de passe / Enter password');
alert(dechiffre(h));
cs


뭘 입력해도 가짜 패스워드만 나온다...


25행에 있는 헥스값을 아스키로 바꿔서 인증했더니 됐다. 뭐지





XSS - Stored 1



xss 공격이 가능하다. xss를 이용해서 쿠키값을 탈취하면 된다.






Flash - Authentication



소스보기를 통해 플래시 파일 주소를 알아낸다.


http://challenge01.root-me.org/web-client/ch20/RootMe.swf


다운받는다.


플래시 디컴파일러 툴을 이용해 소스를 보면 된다.


모르겠다.












728x90
반응형
728x90
반응형

리캡챠를 적용할 페이지는 login.php (.html이어도 적용 가능합니다.), 검증을 하는 페이지는 login_chk.php (php로 작성하였습니다.)로 가정을 하겠습니다.




1. 리캡챠 키를 생성


아래 링크에 접속합니다.

https://www.google.com/recaptcha/admin






Label 에는 그냥 이름 하나 적어줍니다. ex) login page


reCAPTCHA v3를 선택하고,


Domains에 사이트 도메인을 적어주고,


정책 동의에 체크한 후 register을 누릅니다.



Site key 와 Secret key는 기록해 둡니다.






2. 코드 삽입 (login.php)


login.php에서 <head></head> 태그 사이에 아래 코드를 삽입합니다.

<Site Key> 에 자신의 Site key를 입력합니다.


<script src='https://www.google.com/recaptcha/api.js?render=<Site key>'></script>


<script type="text/javascript">

  grecaptcha.ready(function() {

   grecaptcha.execute('<Site Key>', {action: 'loginpage'})

   .then(function(token) {

    document.getElementById('g-recaptcha-response').value = token;

   });

  });

</script>



login page 에서 로그인 <form> 태그안에 아래 코드를 삽입합니다.



    <form name="login_form" method="post" action="./login_chk.php">

...(중략)....

      <input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response">

    </form>






3. 코드 삽입 (login_chk.php)



php 코드 안에 아래 코드를 삽입합니다.

<Secret key> 안에 자신의 Secret key를 입력하면 됩니다.


//recaptcha

$captcha=$_POST['g-recaptcha-response'];

$secretKey = "<Secret key>";

$ip = $_SERVER['REMOTE_ADDR'];

$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secretKey."&response=".$captcha."&remoteip=".$ip);

$responseKeys = json_decode($response,true);


if($responseKeys["success"]) {

  //통과한 경우의 코드를 작성

 }

else {

  //통과하지 못한 경우의 코드를 작성

 }

//recaptcha


조건 if($responseKeys["success"]) 이 외에도 https://developers.google.com/recaptcha/docs/v3 문서의 Site Verify Response 부분을 참조하여 통과여부를 설정할 수 있습니다. 저는 간단히 success 부분만 받아 검증한 것입니다.



728x90
반응형
728x90
반응형

MISC 미슼






간단히 페이지 소스보는 문제






FLAG : Th1$_15_sT4rt!!


1점짜리 문제 


728x90
반응형

+ Recent posts