문제 확인
문제 풀이
서버 생성하여 접속한 화면이다.
다운로드 받은 파일 중 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;
}
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>';
}
우선 위 getRandStr() 함수를 통해 $id는 무작위 10자리 문자열을 생성하는 걸 알 수 있다.
$pw는 sha1("1")로 값을 저장하고 있는데, SHA-1 해시 값은 규칙을 설정하지 않는 경우 40자리의 16진수 문자열 확인할 수 있다. 이 값은 항상 "356a192b7913b04c54574d18c28d46e6395428ab"이다.
sha1()
** php 단방향 암호화/ 해쉬함수; Secure Hash Algorithm
현재는 md5 와 같이 결함이 발견되어 보안용도로는 사용하지 않도록 권장하는 알고리즘이다.
- 사용방법
sha1([문자열], [규칙]);
- sha1()의 인수 값 // 규칙
TRUE - sha1 의 결과값이 20자리가 되어 출력
FALSE - sha1 의 결과값이 40자리가 되어 출력되어 규칙을 설정하지 않는 경우 기본값
위의 코드에서 $input_pw의 길이를 8로 조건을 맞춰두었기에, "356a192b7913b04c54574d18c28d46e6395428ab"의 앞 8자리로 설정해준다. 즉, "356a192b"
$input_id 는 (int)로 형변환을 해주고 있는데, 이는 다음과 같은 규칙성을 가진다.
따라서 첫 번째 문자열이 문자이면 항상 0을 출력하므로 '0000000000'로 설정해준다.
따라서 해당 값을 대입하여 제출하면 플래그를 획득할 수 있다.
플래그 획득!
[출처]
'SWLUG > CTF' 카테고리의 다른 글
[WebHack][Webhacking.kr] old-52 (1) | 2024.09.23 |
---|---|
[WebHack][WebGoat] 환경세팅 & Hijack a session (1) | 2024.09.16 |
[CTF/ 써니나타스] Web -1 (0) | 2024.05.23 |
[CTF/Dreamhack] easy-login (0) | 2024.05.21 |
[CTF/Dreamhack] web-misconf-1 (0) | 2024.05.17 |