컴퓨터에서는 문자를 인코딩할 시, 아스키 코드를 기반으로 문자를 변환하여 저장하게 된다. 이를 이용한 문제
들어가면 입력을 받는 사이트가 나온다.
코드를 함 보자.
index.php
<html>
<head>
<link rel="stylesheet" href="<https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css>">
<title>php7cmp4re</title>
</head>
<body>
<!-- Fixed navbar -->
<nav class="navbar navbar-default navbar-fixed-stop">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/">php7cmp4re</a>
</div>
<div id="navbar">
<ul class="nav navbar-nav">
<li><a href="/">index page</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container">
<div class="box">
<h4>Enter the correct Input.</h4>
<p>
<form method="post" action="/check.php">
<input type="text" placeholder="input1" name="input1">
<input type="text" placeholder="input2" name="input2">
<input type="submit" value="제출">
</form>
</p>
</div>
<?php
require_once('flag.php');
error_reporting(0);
?>
</div>
</body>
</html>
flag.php
<?php
$flag = 'flag{**Sample**}'
?>
check.php
<html>
<head>
<link rel="stylesheet" href="<https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css>">
<title>php7cmp4re</title>
</head>
<body>
<!-- Fixed navbar -->
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/">php7cmp4re</a>
</div>
<div id="navbar">
<ul class="nav navbar-nav">
<li><a href="/">Index page</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container">
<?php
require_once('flag.php');
error_reporting(0);
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$input_1 = $_POST["input1"] ? $_POST["input1"] : "";
$input_2 = $_POST["input2"] ? $_POST["input2"] : "";
sleep(1);
if($input_1 != "" && $input_2 != ""){
if(strlen($input_1) < 4){
if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9"){
if(strlen($input_2) < 3 && strlen($input_2) > 1){
if($input_2 < 74 && $input_2 > "74"){
echo "</br></br></br><pre>FLAG\\n";
echo $flag;
echo "</pre>";
} else echo "<br><br><br><h4>Good try.</h4>";
} else echo "<br><br><br><h4>Good try.</h4><br>";
} else echo "<br><br><br><h4>Try again.</h4><br>";
} else echo "<br><br><br><h4>Try again.</h4><br>";
} else{
echo '<br><br><br><h4>Fill the input box.</h4>';
}
} else echo "<br><br><br><h3>WHat??!</h3>";
?>
</div>
</body>
</html>
여기서, 우리는 check.php를 집중적으로 살펴보자.
if($input_1 != "" && $input_2 != ""){
if(strlen($input_1) < 4){
if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9"){
if(strlen($input_2) < 3 && strlen($input_2) > 1){
if($input_2 < 74 && $input_2 > "74"){
echo "</br></br></br><pre>FLAG\\n";
echo $flag;
echo "</pre>";
} else echo "<br><br><br><h4>Good try.</h4>";
} else echo "<br><br><br><h4>Good try.</h4><br>";
} else echo "<br><br><br><h4>Try again.</h4><br>";
} else echo "<br><br><br><h4>Try again.</h4><br>";
} else{
echo '<br><br><br><h4>Fill the input box.</h4>';
}
} else echo "<br><br><br><h3>WHat??!</h3>";
?>
2개의 입력창에 원하는 값을 입력할 경우, flag를 출력한다는 사실을 알 수 있다.
먼저, input1의 코드부터 살펴보자.
if(strlen($input_1) < 4){
if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9"){
문자열의 길이는 3이하여야 하고, 문자 8보다 작으면서 7.A보다 작고, 그러면서 7.9보다 커야된다고 나온다.
컴퓨터는 문자열을 그대로 문자열로 받지 않고, 숫자(아스키코드)로 변환해서 인식한다.
문자열 “8”은 숫자 8이 아닌, 아스키코드로 변환한 값 56으로 인식된다. 마찬가지로 7.A도 7.65로 인식될 것이다. 그러면 7.9는? 7.57로 인식된다.
7.:나 7.;를 입력해보자.
input2는 아무거나 입력해 보았다.