반응형
문제설명
php로 작성된 페이지입니다.
알맞은 Id과 Password를 입력하여 플래그를 획득하세요.
플래그의 형식은 DH{...} 입니다.
코드분석
check.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;
}
- 인자로 길이를 받는데, 안 주면 기본값으로 10을 받음
- 문자열에 들어갈 문자 후보들 0~9a-zA-Z까지이다.
- 랜덤문자열은 빈 공간으로 시작하고 0~61번의 인덱스 중 하나 뽑아서 하나씩 골라서 최종 랜덤 문자열 반환함
즉, 랜덤 문자열 뽑는 함수
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는 랜덤 문자열 10자, pw는 sha1("1") 임
- 입력받은 id가 입력한 id와 랜덤 id가 같고 문자열이 10 글자면 통과
- pw과 입력한 pw와 sha("1")한 값이 같고 8글자이면 통과
취약점 분석
if((int)$input_id == $id && strlen($input_id) === 10)
- PHP 7.xx에서 '==' 는 느슨한 비교라서 정수와 문자열을 비교할 때 PHP사 한쪽을 반환함
즉, 입력한 값은 (int)로 형변환을 하는데 aaaa 같은 것을 입력하면 0 이 됨. 오른쪽 값도 랜덤 문자열이라 aBcDeF.. 라 했을 때 숫자로 보면 0이라 조건이 만족이 됨
if((int)$input_pw == $pw && strlen($input_pw) === 8)
- sha1("1")은 항상 "356xxx..."로 시작함
- 만약 입력값이 356aaaaa라면 356까지만 숫자로 읽혀서 정수형 반환 시 356을 반환하게 됨
오른쪽도 sha("1")이라 356asdsda...으로 들어가기 때문에 정수형 반환 시 356까지만 반환하게 되어 조건이 만족됨
익스플로잇
ID 값에 문자열 10글자만 되면 조건이 통과
PW값에 356으로 시작하는 문자열 8글자만 쓰면 통과한다.


반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| simple-phparse (0) | 2026.02.09 |
|---|---|
| BypassIF (0) | 2026.02.09 |
| baby-union (0) | 2026.02.08 |
| amocafe (0) | 2026.02.08 |
| command-injection-chatgpt (0) | 2026.02.08 |