문제화면이다.
flag.php, check.php, index.php 3개의 파일이 존재한다.
문제를 풀기위해서는 check.php 만 보면 될 거 같다.
다음은 check.php 에 중요한 부분을 발췌한것이다.
<?php
function getRandStr($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[mt_rand(0, $charactersLength - 1)];
}
return $randomString;
}
require_once('flag.php');
error_reporting(0);
$id = getRandStr();
$pw = sha1("1");
// POST request
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$input_id = $_POST["input1"] ? $_POST["input1"] : "";
$input_pw = $_POST["input2"] ? $_POST["input2"] : "";
sleep(1);
if((int)$input_id == $id && strlen($input_id) === 10){
echo '<h4>ID pass.</h4><br>';
if((int)$input_pw == $pw && strlen($input_pw) === 8){
echo "<pre>FLAG\n";
echo $flag;
echo "</pre>";
}
} else{
echo '<h4>Try again.</h4><br>';
}
}else {
echo '<h3>Fail...</h3>';
}
?>
id는 랜덤 출력하는 함수를 이용하여 무작위로 되어있는 거 같고 pw는 sha1(해시 함수)를 이용하여 '1'를 암호화시켰다.
if를 보면 먼저 input_id를 받아 int로 type을 변환하여 == (느슨한 비교)를 $id와 한다.
그리고 strlen($input_id)를 받아 문자열의 길이를 반환해서 문자 개수가 10개 인지를 한다.
pw도 똑같이 int로 type 변환을 하여 문자 개수가 8개인지를 확인한다.
그럼 앞에 있는 id에 대한 if를 먼저 우회해 보자.
id를 우회하기 앞서 문자열 형변환과 느슨한 비교에 대해서 알 필요가 있다.
먼저 문자열 형변환에 대해서 간단히 확인해 보면
$test = "12abc3456";
$test2 = "abc123c456";
print((int)$test); // -> 12
print((int)$test2); // -> 0
문자열의 맨 앞자리가 문자 형식이라면 출력 결과는 0 이 출력이 되고
반대로 맨 앞자리가 숫자라면 출력 결과는 숫자가 출력된다.
엄격한 비교(===)와 달리 느슨한 비교(==)는 0을 받으면 True로 인식시킨다.
차이점이라면 느슨한 비교는 타입 변환을 허용시키지만 엄격한 비교는 타입과 값을 모두 비교시켜 더 안전한 비교이다.
그렇다면 0을 반환시키면서 문자열의 길이가 10이라면 ID에 대한 if는 우회가 가능하다는 것이다.
ID pass. 가 출력되어 우회가 확인되었다.
나머지 pw를 우회시켜 보자.
$pw = sha1("1");
pw는 아까 설명했듯이 sha1 해시함수로 암호화되어 있다.
id와는 다르게 우회시켜야 한다.
왜냐하면 $pw에 담겨있는 내용을 알기 때문이다.
그렇다면 암호화한 값을 가지고 문자열의 길이를 충족시켜 준다면...
플래그값이 나온다.
'DreamHack > CTF' 카테고리의 다른 글
(CTF 출제) Random-Test (0) | 2024.09.04 |
---|---|
(CTF출제) mongoboard (1) | 2024.09.04 |
(CTF출제) baby-union (0) | 2024.09.03 |
(CTF 출제)Out of money (0) | 2024.05.08 |
(CTF 출제)DreamHack - broken-png (0) | 2024.05.08 |