문제를 클릭하면 아무것도 없고 view-source만 있습니다. 소스를 보도록 합니다.

 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 26</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }    
a { color:lightgreen; }
</style>
</head>
<body>
<?php
  if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
  $_GET['id'] = urldecode($_GET['id']);
  if($_GET['id'] == "admin"){
    solve(26);
  }
?>
<br><br>
<a href=?view_source=1>view-source</a>
</body>
</html>

 

 GET 방식으로 id 값을 넘겨 받고 해당 값이 admin이면 no! 를 출력하며 끝납니다. 하지만 admin이 아닐경우 id에 id값을 URL 디코딩하여 다시 넣어주고 해당 값이 admin이면 solve를 호출합니다. 그래서 admin을 URL인코딩해서 넘기면 되는데.. 해보시면 아시겠지만 그냥 admin으로 인식해버려서 no! 가 출력되버립니다. 즉, id값을 처음 검증할때 이미 한번 디코드한다는 뜻이니 인코딩을 2번하면 됩니다.

 

%61%64%6D%69%6E -> URL decode -> admin -> 첫번째 조건문에 걸림 -> no!

%2561%2564%256D%2569%256E -> URL decode -> %61%64%6D%69%6E -> 첫번째 조건문 패스 -> URL decode -> admin

'Web Hacking > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-06  (0) 2019.10.29
[Webhacking.kr] old-54  (0) 2019.10.22
[Webhacking.kr] old-25  (0) 2019.10.22
[Webhacking.kr] old-24  (0) 2019.10.22
[Webhacking.kr] old-17  (0) 2019.10.22

 

 정말 고생했던 문제입니다.. 분명 150점 짜리이고 리메이크 되기전에 간단하게 풀었던 문제인데 몇시간을 투자해도 도저히 풀 수 없어서 그냥 rubiya님께 문의해서 힌트를 받아서 풀 수 있었습니다.. 때문에 이 문제 풀이는 접은글로 닫아두고 제가 rubiya님에게 받은 힌트를 보여드리겠습니다. 해당 힌트를 참고해서 풀어보시고 그래도 모르시겠다면 접은 글을 참고하시면 될것 같습니다.

[힌트]
https://www.php.net/manual/en/wrappers.php.php

 

PHP: php:// - Manual

This parameter takes one or more filternames separated by the pipe character |.

www.php.net

[추가 힌트]
제가 드리는 추가 힌트입니다.

1. 위의 페이지에서 filter 를 사용합니다
2. php wrapper vuln 을 키워드로 검색하시면 관련 자료들이 나옵니다.

 

[풀이]

...더보기

 이 문제는 PHP Wrapper 중 filter를 이용하면 풀 수 있습니다. filter의 기능중에 base64 인코딩 기능이 있는데 이를 이용해서 flag,php를 인코딩 시키면 저 텍스트 박스에 php 소스가 base64로 인코딩된 값이 출력됩니다. 해당 값을 decode하고 flag값을 인증하면 끝!

http://webhacking.kr:10001/?file=php://filter/convert.base64-encode/resource=flag

'Web Hacking > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-54  (0) 2019.10.22
[Webhacking.kr] old-26  (0) 2019.10.22
[Webhacking.kr] old-24  (0) 2019.10.22
[Webhacking.kr] old-17  (0) 2019.10.22
[Webhacking.kr] old-16  (0) 2019.10.22

 

 문제를 클릭하면 위처럼 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>";
  }
?>

 

 저는 이미 풀어져있는 문제라 후배 블로그에서 소스코드를 긁어왔습니다. extract 함수를 이용해 $_SERVER와 $_COOKIE를 가져오는데 두 변수는 PHP 예약 변수로 각각 서버(혹은 실행환경)의 정보를 담고 있는 배열과 쿠키의 정보를 담고 있는 배열입니다. 그 후 ip에 REMOTE_ADDR 값을, agent에 HTTP_USER_AGENT 값을 넣어줍니다.

 그 뒤에 ip값을 특정 조건에 맞게 변환해준 뒤 해당 ip값이 127.0.0.1이면 solve를 호출하는 방식입니다. 이 문제의 취약점은 $_SERVER를 추출해온 뒤 $_COOKIE를 추출했다는 부분입니다. $_SERVER를 추출할때 REMOTE_ADDR값을 가져왔는데 $_COOKIE를 추출할때 쿠키 값에 똑같이 REMOTE_ADDR 값이 존재한다면 해당 값을 쿠키에 있던 값으로 덮어 씌웁니다.

 대충.. 이런느낌?

위와 같은 취약점 때문에 쿠키값에 REMOTE_ADDR 값을 넣고 위의 조건에 맞춰서 127.0.0.1이 되게 만들어주면 됩니다.

 

끝!

'Web Hacking > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-26  (0) 2019.10.22
[Webhacking.kr] old-25  (0) 2019.10.22
[Webhacking.kr] old-17  (0) 2019.10.22
[Webhacking.kr] old-16  (0) 2019.10.22
[Webhacking.kr] old-14  (0) 2019.10.22

 

문제를 클릭해보면 검은 화면에 텍스트박스, check 버튼이 끝입니다. 소스를 봅시다.

 

<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>

 

 unlock에 굉장히 복잡한 계산을 한 값을 넣고 sub함수에서 사용자가 텍스트 박스에 입력한 값과 unlock값을 비교하여 같다면 문제가 풀리는 방식입니다. 이 문제는 3가지 방식이 있는데 첫번째는 개발자 도구를 이용해 unlock값을 알아내는 방법이고 두번째는 함수를 재정의하는 방법이고 마지막은 직접 계산(...)하는 방법입니다. 세번째 방법은 생략하고 첫번째와 두번째 방법을 소개하겠습니다.

 

첫번째 방법

 어차피 unlock값은 이미 페이지를 로드할때 다 계산되어 있으므로 바로 unlock을 입력해서 값을 확인하면 됩니다. 만약 확실한게 좋다고 하시는분은 소스 코드에서 unlock 연산 코드를 긁어와서 그대로 복붙해서 넣으시면 됩니다.

 

두번째 방법

 위처럼 if문 안에 1을 넣어서 무조건 참이 되게 만들어주고 호출하면 됩니다.

 

끝!

'Web Hacking > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-25  (0) 2019.10.22
[Webhacking.kr] old-24  (0) 2019.10.22
[Webhacking.kr] old-16  (0) 2019.10.22
[Webhacking.kr] old-14  (0) 2019.10.22
[Webhacking.kr] old-01  (0) 2019.10.22

 

 문제를 클릭하면 위처럼 별이 찍혀있고 WASD에 따라 큰 별이 움직이고 큰 별이 움직일때마다 작은 별들이 찍힙니다. 일단 소스를 봅니다.

 

<html>
<head>
<title>Challenge 16</title>
<body bgcolor=black onload=kk(1,1) onkeypress=mv(event.keyCode)>
<font color=silver id=c></font>
<font color=yellow size=100 style=position:relative id=star>*</font>

<script> 
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>";
}
</script>
</body>
</html>


 onkeypress를 통해 mv함수에 사용자가 입력한 키값을 넘기고 mv에서는 키값을 cd라는 변수에 받고 변수값에 따라 별의 위치를 움직입니다. 이때 100,97,119,115는 WASD의 아스키코드 값입니다. 그런데 딱 보면 알겠지만 아스키코드 값으로 124가 들어오면 별의 위치를 변경하는게 아니라 php파일로 이동합니다. 당연히 저게 solve와 관련된 php겠죠.

 이 문제도 두가지 방법이 있습니다. 첫번째는 아스키코드 124에 해당하는 키 값을 입력해주는 방법이고 두번째는 개발자 도구를 이용하는 방법입니다. 둘중에 편한 방법으로 푸시면 됩니다.

첫번째 방법

 구글에 아스키 코드 표를 검색하여 124의 값을 찾습니다. 위의 표를 참고하면 알 수 있듯이 | (파이프)입니다. 그래서 해당 문제의 페이지에서 Shift + \를 눌러주면 문제가 풀립니다.

 

두번째 방법

개발자 도구를 열고 그냥 바로 mv함수를 호출할때 인자값으로 124를 넘기면 됩니다.

 

끝!

'Web Hacking > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-24  (0) 2019.10.22
[Webhacking.kr] old-17  (0) 2019.10.22
[Webhacking.kr] old-14  (0) 2019.10.22
[Webhacking.kr] old-01  (0) 2019.10.22
[Webhacking.kr] old-06(100)  (0) 2019.09.29

+ Recent posts