Level 11 문제이다.
로그인 후, 페이지의 배경색을 설정할 수 있는 form이 존재하는 문제이다.
소스 코드를 보면... 무슨 말인지 모르겠지만 하나씩 살펴보도록 하자.
<body> 부분에서 "showpassword" 가 "yes"일 경우 다음 레벨의 패스워드를 획득할 수 있다.
즉 data인 쿠키 값을 변조하여 패스워드를 획득하는 문제인 것 같다.
그렇다면, 쿠키 값이 어떻게 생성되었는지 확인해보고 💡거꾸로 실행하여 "showpassword"를 yes로 변경해 새로운 쿠키값을 생성해서 넣어준다면? 답이 해결될 것으로 보인다!!
① 쿠키값을 생성한 과정 확인
- saveData() 함수에서 json_encode > xor_encrypt > base64_encode 순으로 생성하고 있다.
그렇다면, 반대로 base64_decode > xor_encrypt > json_decode 순으로 진행해주면 된다.
② 키 값을 구하기
- xor_encrypt() 함수에서 key 값을 이용해 xor 연산으로 도출된 결과값을 전달한다.
예로) A xor B = C 인 경우, A xor C = B 가 된다.
디코딩 된 쿠키값(A) |
Key 값(B) |
인코딩 된 쿠키값(C) |
base64_decode |
key |
json_encode |
이 공식으로 디코딩 된 쿠키값(A) xor Key 값(B) = 인코딩 된 쿠키값(C)
>> 디코딩 된 쿠키값(A) xor 인코딩 된 쿠키 값(C) = Key값(B) 이므로 Key값을 구할 수 있게 된다.
- xor_encrypt() 함수를 활용하여 코드를 작성하자.
1 <?php
2 function xor_encrypt() {
3 $defaultdata = json_encode(array("showpassword"=>"no", "bgcolor"=>"#ffffff"));
4 $key = '';
5 $text = base64_decode('MGw7JCQ5OC04PT8jOSpqdmkgJ25nbCorKCEkIzlscm5oKC4qLSgubjY=');
6 $outText = $defaultdata;
7
8 for($i=0;$i<strlen($text);$i++) {
9 $key .= $outText[$i] ^ $text[$i % strlen($text)];
10 }
11
12 return $key;
13 }
14
15 echo xor_encrypt();
16 ?>
4 > 구해야할 key 값
5 > 현재 쿠키값을 base64로 decoding
6 > json_encode() 값
9 > Key 값 = json_endoe() 값 xor base64_decode()
- key 값인 KNHL을 구할 수 있다.
③ "showpassword" 가 "yes" 일 때의 쿠키값을 구하기
1 <?php
2 function xor_encrypt() {
3 $defaultdata = array("showpassword"=>"yes", "bgcolor"=>"#ffffff");
4 $key = 'KNHL';
5 $text = json_encode($defaultdata);
6 $outText = '';
7 for($i=0;$i<strlen($text);$i++) {
8 $outText .= $text[$i] ^ $key[$i % strlen($key)];
9 }
10
11 return base64_encode($outText);
12 }
13
14 echo xor_encrypt();
15 ?>
3 > "yes" 로 값 변경
4 > key 값 작성
6 > "yes" 일 때의 쿠키값이 반환될 변수
11 > base64 인코딩 되어 나온 값
- "yes" 일 경우의 쿠키 값을 확인할 수 있다.
Burp 에서 홈에서의 Set color 버튼 클릭 시의 요청값을 잡고 쿠키의 data 값을 위의 결과로 변경해준다.
다음 레벨의 패스워드를 획득할 수 있다. 👏