[드림핵 WEB] LEVEL 1 워게임 Type c-j 문제풀이
https://dreamhack.io/wargame/challenges/960
https://hyunsang.dev/hacking/web-hacking/2023/10/22/dreamhack-type-c-j.html
다른 분의 풀이를 보고 배웠습니다
소스코드를 정확히 읽고 해석할 수 있어야 하는 문제같다
check.php 파일을 먼저 보면 이런 부분이 있다
id는 랜덤 함수를 이용하여 랜덤 생성되고 pw는 1 문자열을 sha1함수를 통해 암호화 한 값 을 의미한다고 한다
getRandStr()는 php 숫자,영문을 조합하여 원하는 길이만큼 랜덤으로 문자열을 출력하는 함수이다
다음 사이트를 이용하여 1의 해싱 결과를 보면
356a192b7913b04c54574d18c28d46e6395428ab
이 나왔다
바로 아래 부분의 소스코드를 보면 id는 10글자이고 pw는 8글자로 이루어져 있어야한다
따라서 pw는 위의 결과에서 8자리만 사용된다
다음으로 중요하게 봐야할 부분은
<chatgpt피셜>
*php의 형변환 규칙
PHP에서 (int)를 사용하여 변수를 정수형으로 변환할 때, 문자열로 시작하는 경우 해당 문자열이 숫자로 시작하지 않으면 변환 결과는 0이 됩니다.
예를 들어, 문자열 "123abc"를 정수형으로 변환하면 123이 됩니다. 그러나 문자열 "abc123"을 정수형으로 변환하면 0이 됩니다. 따라서 첫 번째 글자가 숫자가 아니라면 정수로 변환할 때 0으로 간주됩니다.
따라서 코드에서 $_POST["input_id"]를 정수형으로 변환한 후, $id와 비교하고 있는데 만약 $_POST["input_id"]가 "abc123"과 같은 문자열이라면 (int)$_POST["input_id"]는 0이 되므로 $id와 같은지 비교하는 조건은 거짓이 된다
이런 규칙을 알고 (int)$_POST["input_id"] 가 $id 와 같고 10글자 이려면 id는 0000000000 가 된다
(조금 이해가 안되긴한다... 0000000000말고 다른 방법은 없는건가..?)
규칙을 모두 적용시킨 후 (int)$input_id와 $id와의 비교 과정에서 일치하려면 0이 될 수 밖에 없는것 인가 ..?
하지만 1111111111 은 왜 될 수 없는지 이해가 안된다 ..;
진짜 너무 궁금해서 처음으로 질문도 올려봤다
누군가 답변을 주길 기다려보겠다 ...

다음과 같이 입력하였다
플래그가 나옴 !
DH{33f2cac27f2cd193c31ac34b1b8bc99e2fbb731bd8a94c512c17d13dbf80794a}
php 형식에 대한 이해가 부족했다
이런게 있는줄도 몰랐네 ...
그리고 코드 해석하는 능력도 ..