반응형

처음에 놀리는 것 처럼 한글자씩 빠르게 지나가다가 ?가 마지막에 나온다.

 

코드를 살펴보자.

function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
x=run();
function answer(i){
  x.open('GET','?m='+i,false);
  x.send(null);
  aview.innerHTML=x.responseText;
  i++;
  if(x.responseText) setTimeout("answer("+i+")",20);
  if(x.responseText=="") aview.innerHTML="?";
}
setTimeout("answer(0)",1000);

빠르게 i값을 증가시키면서 한글자씩 보내고 마지막에 받을 응답이 더이상 없는 경우 ?를 출력한다.

 

개발자 도구를 통한 코드 수정을 해보아도 잘안되어서 재정의하여 풀어버렸다.

 

function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
x=run();
function answer(i){
  x.open('GET','?m='+i,false);
  x.send(null);
  aview.innerHTML+=x.responseText;
  i++;
  if(x.responseText) setTimeout("answer("+i+")",20);
}
setTimeout("answer(0)",1000);

한글자씩 추가하며 계속 출력되도록 만들었고, 마지막에 ?로 덮어띄우는 부분을 없애버렸다.

 

flag가 잘 나온다.

이를 어디에 넣어야할지 헤매다가 본래 홈페이지에 auth칸에 입력하여 푸는 것이라는 것을 알게되었다.

반응형

'webhacking.kr' 카테고리의 다른 글

webhacking.kr [old-24]  (0) 2023.07.13
webhacking.kr [old-05]  (0) 2023.07.13
webhacking.kr [old-10]  (0) 2023.07.13
webhacking.kr [old-03]  (0) 2023.07.13
webhacking.kr [old-26]  (0) 2023.07.13
반응형

쉬운 문제였다.

 

코드를 해석해보면 클릭을 한번 할때마다 1px씩 옆쪽으로 이동한다.

style.left의 값이 1600인 조건을 만족하는 경우,  문제가 풀리는 것 같다.

 

style.left를 바로 1600으로 바꾸었는데 풀리지 않았다.

100씩 옮겨져도 풀리지 않기에 100씩 옮긴 이후에 값을 보니 1616이었다. 현재의 위치까지 +1되는 것같다.

그렇기에 그냥 style.left를 1599로 바꾸고, 1px씩 이동하게 하였다.

 

바로 풀린다.

dreamhack의 carve party와 비슷한 느낌의 문제였다.

반응형

'webhacking.kr' 카테고리의 다른 글

webhacking.kr [old-05]  (0) 2023.07.13
webhacking.kr [old-54]  (0) 2023.07.13
webhacking.kr [old-03]  (0) 2023.07.13
webhacking.kr [old-26]  (0) 2023.07.13
webhacking.kr [old-16]  (0) 2023.07.13
반응형

처음 나오는 모노그램은 간단하게 풀린다.

진짜 문제는 이후였다. 아래와 같이 이름을 남기는 공간이 존재한다. 

 

sqli를 하기 위하여 ' " 등의 다양한 쿼리를 보내보았지만 반응이 없었다.

burp suite를 확인해보니 answer도 body에 담겨서 보내지는 값이었따.

 

수많은 삽질을 id에 하다가 혹여 answer에도 sql문지 주입되나 싶어서 

싱글쿼터를 삽입하여 확인해보니 다음과 같이 나왔다.

아무 반응이 없던 id와 달리 반응이 나타난다.

 

answer=1010100000011100101011111' or 1=1--&id=test

 

상기의 쿼리문을 통하여 풀었다.

 

반응형

'webhacking.kr' 카테고리의 다른 글

webhacking.kr [old-54]  (0) 2023.07.13
webhacking.kr [old-10]  (0) 2023.07.13
webhacking.kr [old-26]  (0) 2023.07.13
webhacking.kr [old-16]  (0) 2023.07.13
webhacking.kr [old-06]  (0) 2023.07.13
반응형
<?php
  if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
  $_GET['id'] = urldecode($_GET['id']);
  if($_GET['id'] == "admin"){
    solve(26);
  }
?>

id가 admin이면 해결되는 간단한 문제이다. 그러나 admin이 필터링되고 있다.

또한, GET방식으로 받아온 id를 urldecoding하여 대조한다.

 

처음엔 admin을 ascii코드로 변환하면 %61%64%6D%69%6E 이기에 ?id=%61%64%6D%69%6E를 보내었지만 필터링에 걸렸다.

 

아마 이전에 dreamahck에서도 언젠가 풀었던 문제처럼 브라우저에서 자체적으로 디코딩이 한번 더 이루어지므로 본인이 인코딩하여 보내어도 바로 admin으로 변해 필터링에 걸리는 것이다.

 

그러므로 더블인코딩하여 보낸다. 이리하면 브라우저를 통한 변환으로 %61%64%6D%69%6E가 전달되고, 쿼리에는 인코딩된 값이 박히므로, 필터링 룰을 통과할 수 있다.

 

더블인코딩된 admin => %2561%2564%256D%2569%256E

 

반응형

'webhacking.kr' 카테고리의 다른 글

webhacking.kr [old-10]  (0) 2023.07.13
webhacking.kr [old-03]  (0) 2023.07.13
webhacking.kr [old-16]  (0) 2023.07.13
webhacking.kr [old-06]  (0) 2023.07.13
webhacking.kr [old-17]  (0) 2023.07.13
반응형

좀 삽질했던 문제이다.

 

소스코드는 아래와 같다.

 
document.body.innerHTML+="<font color=yellow id=aa style=position:relative;left:0;top:0>*</font>";
function mv(cd){
  kk(star.style.left-50,star.style.top-50);
  if(cd==100) star.style.left=parseInt(star.style.left+0,10)+50+"px";
  if(cd==97) star.style.left=parseInt(star.style.left+0,10)-50+"px";
  if(cd==119) star.style.top=parseInt(star.style.top+0,10)-50+"px";
  if(cd==115) star.style.top=parseInt(star.style.top+0,10)+50+"px";
  if(cd==124) location.href=String.fromCharCode(cd)+".php"; // do it!
}
function kk(x,y){
  rndc=Math.floor(Math.random()*9000000);
  document.body.innerHTML+="<font color=#"+rndc+" id=aa style=position:relative;left:"+x+";top:"+y+" onmouseover=this.innerHTML=''>*</font>";
}

 

mv()는 사용자가 입력하는 cd 값에 따라 별의 위치가 이동하는 듯하다.

kk함수는 랜덤한 색상의 별을 추가하며 마우스를 올려놓을 시 별이 없어지도록 한다.

 

자판을 순서대로 눌러보니 특정 자판만 별의 위치가 바뀌고 나머지는 그냥 추가된다.

 

w a s d 에 따라 큰 별이 움직이고, 작은 별들은 나머지 자판들에 의해 추가된다.

 

그렇기에 97, 100, 119, 115는 움직이게 해주는 각 wasd의 아스키코드인 것이다. 

 

124에 해당하는 것은 | ( 파이프) 이다.

 

| 를 입력해야한다.

 

풀리네...

반응형

'webhacking.kr' 카테고리의 다른 글

webhacking.kr [old-03]  (0) 2023.07.13
webhacking.kr [old-26]  (0) 2023.07.13
webhacking.kr [old-06]  (0) 2023.07.13
webhacking.kr [old-17]  (0) 2023.07.13
webhacking.kr [old-14]  (0) 2023.07.13
반응형

우선 소스코드를 본다.

<?php
include "../../config.php";
if($_GET['view_source']) view_source();
if(!$_COOKIE['user']){
  $val_id="guest";
  $val_pw="123qwe";
  for($i=0;$i<20;$i++){
    $val_id=base64_encode($val_id);
    $val_pw=base64_encode($val_pw);
  }
  $val_id=str_replace("1","!",$val_id);
  $val_id=str_replace("2","@",$val_id);
  $val_id=str_replace("3","$",$val_id);
  $val_id=str_replace("4","^",$val_id);
  $val_id=str_replace("5","&",$val_id);
  $val_id=str_replace("6","*",$val_id);
  $val_id=str_replace("7","(",$val_id);
  $val_id=str_replace("8",")",$val_id);

  $val_pw=str_replace("1","!",$val_pw);
  $val_pw=str_replace("2","@",$val_pw);
  $val_pw=str_replace("3","$",$val_pw);
  $val_pw=str_replace("4","^",$val_pw);
  $val_pw=str_replace("5","&",$val_pw);
  $val_pw=str_replace("6","*",$val_pw);
  $val_pw=str_replace("7","(",$val_pw);
  $val_pw=str_replace("8",")",$val_pw);

  Setcookie("user",$val_id,time()+86400,"/challenge/web-06/");
  Setcookie("password",$val_pw,time()+86400,"/challenge/web-06/");
  echo("<meta http-equiv=refresh content=0>");
  exit;
}
?>
<html>
<head>
<title>Challenge 6</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<?php
$decode_id=$_COOKIE['user'];
$decode_pw=$_COOKIE['password'];

$decode_id=str_replace("!","1",$decode_id);
$decode_id=str_replace("@","2",$decode_id);
$decode_id=str_replace("$","3",$decode_id);
$decode_id=str_replace("^","4",$decode_id);
$decode_id=str_replace("&","5",$decode_id);
$decode_id=str_replace("*","6",$decode_id);
$decode_id=str_replace("(","7",$decode_id);
$decode_id=str_replace(")","8",$decode_id);

$decode_pw=str_replace("!","1",$decode_pw);
$decode_pw=str_replace("@","2",$decode_pw);
$decode_pw=str_replace("$","3",$decode_pw);
$decode_pw=str_replace("^","4",$decode_pw);
$decode_pw=str_replace("&","5",$decode_pw);
$decode_pw=str_replace("*","6",$decode_pw);
$decode_pw=str_replace("(","7",$decode_pw);
$decode_pw=str_replace(")","8",$decode_pw);

for($i=0;$i<20;$i++){
  $decode_id=base64_decode($decode_id);
  $decode_pw=base64_decode($decode_pw);
}

echo("<hr><a href=./?view_source=1 style=color:yellow;>view-source</a><br><br>");
echo("ID : $decode_id<br>PW : $decode_pw<hr>");

if($decode_id=="admin" && $decode_pw=="nimda"){
  solve(6);
}
?>
</body>
</html>

받아들여지는 val_id와 val_pw를 base64로 20번이나 인코딩하고 문자열들을 replace를 통해 바꾼다.

하지만 어차피 밑에 부분에서 다시 쿠키를 받아들여 디코딩하고, 문자열들도 원래대로 복원시키므로, base64를 통해 인코딩된 값을 쿠키에 넣어주면 된다.

 

파이썬 온라인 컴파일러를 통해 풀어주었다.(https://www.onlinegdb.com/online_python_compiler)

id=admin, passwd=nimda이므로 각각에 해당하는 값을 쿠키에 넣어준다.

 

무난하게 풀렸다.

반응형

'webhacking.kr' 카테고리의 다른 글

webhacking.kr [old-26]  (0) 2023.07.13
webhacking.kr [old-16]  (0) 2023.07.13
webhacking.kr [old-17]  (0) 2023.07.13
webhacking.kr [old-14]  (0) 2023.07.13
webhacking.kr [old-18]  (0) 2023.07.13
반응형

주어진 코드는 아래와 같다.

<html>
    <head>
        <title>Challenge 17</title>
    </head>
    <body bgcolor=black>
        <font color=red size=10></font>
        <p>
        <form name=login>
            <input type=passwd name=pw>
            <input type=button onclick=sub() value="check">
        </form>
        <script>
            unlock = 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 / 100 * 10 * 10 + 1 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 + 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 - 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 / 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 / 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 / 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 / 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 / 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 / 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 / 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 / 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 / 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 * 100 * 10 * 10 + 100 / 10 - 10 + 10 + 50 - 9 * 8 + 7 - 6 + 5 - 4 * 3 - 2 * 1 * 10 + 9999999;
            function sub() {
                if (login.pw.value == unlock) {
                    location.href = "?" + unlock / 10;
                } else {
                    alert("Wrong");
                }
            }
        </script>

 

1. unlock이라는 굉장히 수식이 나온다.

결과: 7809297.1 

console을 이용해 편하게 계산

function sub()

2. login.pw.value와 unlock이 같은 경우 현재 url에 unlock/10을 하여 다른 사이트가 열린다.

 

그러므로 unlock의 값인 7809297.1을 넣어주면 바로 풀린다.

 

푼경우 아래의 url로 간다.

반응형

'webhacking.kr' 카테고리의 다른 글

webhacking.kr [old-16]  (0) 2023.07.13
webhacking.kr [old-06]  (0) 2023.07.13
webhacking.kr [old-14]  (0) 2023.07.13
webhacking.kr [old-18]  (0) 2023.07.13
webhacking.kr [old-1]  (0) 2023.07.13
반응형

아래와 같이 코드가 구현되어 있다.

<html>
<head>
<title>Challenge 14</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<br><br>
<form name=pw onsubmit=ck()><input type=text name=input_pwd><input type=button value="check" onclick=ck()></form>
<script>
function ck(){
  var ul=document.URL;
  ul=ul.indexOf(".kr");
  ul=ul*30;
  if(ul==pw.input_pwd.value) { location.href="?"+ul*pw.input_pwd.value; }
  else { alert("Wrong"); }
  return false;
}
</script>
</body>
</html>

 

function ck()를 해석해보면

1. var ul 에 현재 페이지의 URL이 담긴다.

2. URL에서 .kr의 index를 찾는다.

3. index에 30을 곱한다.

4. 곱해진 index가 pw.input_pwd.value와 같을 경우 현재 페이지의 URL에 ?+비교한 값을 같이 보낸다.

 

현재 URL은 https://webhacking.kr/challenge/js-1/?input_pwd= 이런식으로 흘러간다

 

.kr의 인덱스 위치는 18이다.

그러므로 여기에 30을 곱한 값인 540을 보내면 if문을 만족하고 문제가 풀린다.

 

 

-처음에 https://를 빼고 index를 계산하여 못풀었었다.

 

반응형

'webhacking.kr' 카테고리의 다른 글

webhacking.kr [old-16]  (0) 2023.07.13
webhacking.kr [old-06]  (0) 2023.07.13
webhacking.kr [old-17]  (0) 2023.07.13
webhacking.kr [old-18]  (0) 2023.07.13
webhacking.kr [old-1]  (0) 2023.07.13

+ Recent posts