문제
코드
showpassword값이 yes가 되면 문제는 풀린다.
defaultdata는 배열인데 "showpassword"값은 no, "bgcolor"는 하얀색인 것을 알 수 있다
함수가 3개가 있다. 이를 각각 살펴보자
xor_encrypt함수에서 key는 검열되었다. text에는 in의 값이 들어간다.
$outText .= $text[$i] ^ $key[$i % strlen($key)];
A^B=C일때 A^C는 XOR 성질 때문에 A^C = B가 된다
우리가 구하고자 하는 것은 key 값이기 때문에 xor의 성질을 이용하여 key값을 구할 수 있다.
loadData 함수에서는 cookie값을 가져와서 base64_decode>xor_encrypt>json_decode 순으로 복호화 하고 이를 tempdata에 저장하고 있다.
saveData 함수에서는 d를 json_encode>xor_encrypt>base64_encode로 암호화 하고 있다.
data에 loadData(defaultdata)값을 넣고 saveData(data)를 호출하는 것을 알 수 있다.
즉, cookie값을 이용해서 xor_encrypt함수를 이용하여 key값을 찾고 이 key값을 이용하여 xor_encrypt함수에서 showpassword가 yes일대의 cookie값을 찾아 변조한다.
풀이
크롬 확장 프로그램으로 EditThisCookie라는 프로그램을 설치해놔서 쉽게 쿠키값을 확인할 수 있었다.
이제 key값을 구해야 한다.
xor_encrypt 함수에서 특정 key값을 이용해 xor 연산을 해서 $outText를 생성한다.
saveData함수에서 쿠키 생성을 위한 함수(setcookie)의 실행 순서는 다음과 같다.
json_encode() > xor_encrypt() > base64_encode()
우리는 쿠키값을 알고 있기 때문에 이것의 반대 과정을 통해 key값을 알 수 있다.
쿠키의 base64_decode()의 반환 값과 key를 XOR 연산하면 json_encode($defaultdata)의 반환 값이 나올 것이다.
A^B=C일때 A^C는 XOR 성질 때문에 A^C = B가 된다
따라서 쿠키값의 base64_decode와 defaultdata의 json_encode를 xor해서 key값을 구한다.
qw8J가 계속 반복 되므로 qw8J가 key값이라는 것을 알 수 있다.
이제 showpassword가 yes일때의 cookie값을 구해야 한다.
cookie값은 아까의 saveData함수에서 쿠키 생성을 위한 함수(setcookie)의 실행 순서를 통해 구할 수 있다.
json_encode() > xor_encrypt() > base64_encode()
쿠키값이 나왔다.
이제 burp suite를 이용하여 변조하자.
burp suite에서 cookie의 data를 바꿨다.
비번은 EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3