
<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">http://host3.dreamhack.games:10711/
<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>
if 문을 전부 우회하면 될 거 같다.
if($input_1 != "" && $input_2 != "")
input_1과 input_2 가 둘 다 빈 문자열이 아닌 경우에 다음 조건으로 넘어간다.
if(strlen($input_1) < 4)
input_1의 문자열 길이가 4보다 작은지 확인한다.
if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9")
input_1의 문자열 "8" 보다 작은지 확인을 한다.
그리고
input_1 < "7.A" -> 문자열 "7.A" 보다 작은지 확인한다.
input_1 > "7.9" -> 문자열 "7.9" 보다 큰지 확인한다.
결론적으로 "7.9" , "7.A" 사이의 문자열 이어야 한다.
PHP에서는 문자열 비교를 할 때 각 문자열의 ASCII 값에 기반하여 문자 단위로 비교를 수행한다.
ASCII 값으로 나열을 한다면
"7.9" -> 55 46 57
이 되는데 여기서 55 -> '7' , 46 -> '.' , 57 -> '9' 이런 식으로 ASCII 값이 나온다.
"7.A" -> 55 46 65
그렇다면 55 46 58으로 값을 올려보면 if문을 우회할 수 있다.
if(strlen($input_2) < 3 && strlen($input_2) > 1)
strlen으로 input_2 길이가 3보다 작은지 확인하고 1보다 큰지 확인한다.
if($input_2 < 74 && $input_2 > "74")
마지막으로 input_2 가 숫자 74 보다 작은지 확인하고 문자열 "74"보다 큰지 확인한다.
PHP에서는 문자열과 숫자를 비교할 때 문자열을 숫자로 받아들여 비교를 한다.
앞부분부터 읽어 들이기에
만약 "a05"라고 대입을 하면 비교할 때 0으로 받아들이게 된다.
"994a"라고 하는 경우에는 994로 변환이 된다.
따라서 알맞은 값을 넣으면 74 보다 작은 수를 충족시킬 수 있다.
문자열 "74"을 비교하기 위해서는 16진수로 변환을 해야 비교시키기 편하다.
"74" -> (h) 37 34
앞에 문자가 오고 "74" 보다 hex 값이 높으면 if 문을 다 우회할 수 있다.

'DreamHack > WEB' 카테고리의 다른 글
| sql injection bypass WAF (0) | 2024.10.29 |
|---|---|
| blind sql injection advanced (0) | 2024.10.23 |
| command-injection-chatgpt (0) | 2024.10.23 |
| error based sql injection (0) | 2024.10.18 |
| simple_sqli_chatgpt (0) | 2024.10.17 |