Hy0unSa9ng
[Web] php7cm4re 본문

두 개의 input 필드가 있습니다. 두 개의 input 필드에서 어떤 정보를 받으며, 어떻게 동작하는지 php 코드를 통해서 확인해 보겠습니다.
<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>
해당 문제는 PHP7의 느슨한 타입 비교(Type Juggling) 취약점을 이용하여 조건문들을 우회하는 문제입니다.
첫번째로, $input_1 조건을 우회해야 합니다. 우회 방법은 아래와 같습니다.
코드 상 조건은 길이가 3 이하이면서, "7.9"보다 크고 "7.A"와 "8"보단 작아야 합니다.
원리는 PHP 7에서는 두 문자열을 비교할 때, 둘 다 숫자형 문자열(ex. "7.9", "8"이면 숫자로 비교하지만, 일반 문자열이 하나라도 섞여 있다면 사전순 비교를 진행합니다.
해법은 $input_1을 숫자가 아닌 일반 문자열로 만들어주면, 숫자의 킈각 아닌 문자의 아스키코드 값으로 비교하게 만들 수 있습니다.
두번째로, $input_2 조건을 우회해야 합니다. 우회 방법은 아래와 같습니다.
조건은 길이가 정확히 2자리이어야 하며, 숫자 74보다는 작고 문자열 "74"보다는 커야 합니다.
- 원리:
- $input_2 < 74: PHP 7에서 문자열과 정수를 비교하면 문자열을 정수로 자동 변환(intval)합니다.
- $input_2 > "74": $input_2가 숫자가 아닌 문자를 포함하고 있다면 양쪽 모두 문자열로 취급하여 사전순 비교를 수행하게 됩니다.
- 해법: 숫자로 시작하되 뒤에 문자를 붙여서 PHP가 이를 일반 문자열로 취급하도록 속이면 됩니다. (ex. 7A)

위 방법으로 풀이하시면 정상적으로 풀이를 할 수 있으며, Flag를 받으실 수 있습니다.
참고하면 좋을 자료
'Wargame > Dreamhack' 카테고리의 다른 글
| [Web] Secret Data (0) | 2026.04.26 |
|---|---|
| [Web] 막창 좋아하세요? 🌱 (0) | 2026.04.26 |
