반응형

이 문제도 처음보는 유형이라 좀 고민을 많이 했었다.

 

첫화면이다. 

 

client ip와 agent 가 보인다.

 

주요 코드 부분은 아래와 같다.

<?php
  extract($_SERVER);
  extract($_COOKIE);
  $ip = $REMOTE_ADDR;
  $agent = $HTTP_USER_AGENT;
  if($REMOTE_ADDR){
    $ip = htmlspecialchars($REMOTE_ADDR);
    $ip = str_replace("..",".",$ip);
    $ip = str_replace("12","",$ip);
    $ip = str_replace("7.","",$ip);
    $ip = str_replace("0.","",$ip);
  }
  if($HTTP_USER_AGENT){
    $agent=htmlspecialchars($HTTP_USER_AGENT);
  }
  echo "<table border=1><tr><td>client ip</td><td>{$ip}</td></tr><tr><td>agent</td><td>{$agent}</td></tr></table>";
  if($ip=="127.0.0.1"){
    solve(24);
    exit();
  }
  else{
    echo "<hr><center>Wrong IP!</center>";
  }

 

ip가 127.0.0.1 이 문제가 풀리는 조건이다.

$_COOKIE에서 $REMOTE_ADDR값을 가져오는 것같다.

 

그러므로 하지만 사이트 초기에는 REMOTE_ADDR값을 가져올 cookie가 없으므로 cookie를 생성해야한다.

 

이때 filtering rule을 우회해야한다.

 

localhost 로 시도해보았지만 localhost로 안풀리기에 이전에 XSS풀 때, 활용했던 bypass기법을 활용하기로 하였다.

일부러 필터링으로 공백처리되는 것을 이용하여 문자열을 중복되게 만드는 것이다.

 

그럼 결국 112277.00.00.1이 우회가능한 ip가 된다.

 

로그인해달라고 떠서 다시 로그인한 이후에 문제에 들어가니 풀렸다.

 

 

===============================================

아마 localhost가 안되었던 이유에 대해서는 아래의 사이트를 참고하여 본 이유 때문이지 않을까 추측해본다.

 

https://www.baeldung.com/cs/127-0-0-1-vs-localhost

===============================================

반응형

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

webhacking.kr [old-25]  (0) 2023.07.15
webhacking.kr [old-27]  (0) 2023.07.15
webhacking.kr [old-05]  (0) 2023.07.13
webhacking.kr [old-54]  (0) 2023.07.13
webhacking.kr [old-10]  (0) 2023.07.13
반응형

간단한 문제였는데 좀 많이 헤맸다...

자꾸 들어가면 아래와 같이 나오면서 webhacking.kr기본 사이트로 계속 이동한다.

 

이동

 

해당 사이트를 아무리 뒤져봐도 아무것도 안나온다....진짜 안나온다..

계속 무한반복하다가 혹시나 해서  burp suite로 어떻게 넘어가나 보기로했다.

 

 repeater로 확인해보니 아래와 같았다.

알림을 표시하고, 페이지를 /로 이동한다.

그리고 이후에 <a>태그를 활용하여 [Get Flag] 링크를 생성한다. 

 

그러므로 직접 https://webhacking.kr/challenge/js-2/?getFlag 링크로 이동하면 문제가 풀린다.

 

 

풀렸다..

반응형

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

webhacking.kr [old-27]  (0) 2023.07.15
webhacking.kr [old-24]  (0) 2023.07.13
webhacking.kr [old-54]  (0) 2023.07.13
webhacking.kr [old-10]  (0) 2023.07.13
webhacking.kr [old-03]  (0) 2023.07.13
반응형

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

 

코드를 살펴보자.

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

+ Recent posts