问题描述
我在做natas11的时候发现了一个问题,问题的需求可以简化为:
$tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true);
其中xor_decode的实现为:
function xor_encrypt($in) {
$key = '<censored>';
$text = $in;
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
我们知道a ^b =c; a ^c=b;所以我们知道处理完的数据为 {“showpassword”:“no”,“bgcolor”:"#ffffff"},读取的cookie值为"ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw%3D",所以只要进行按位抑或即可得到key。接下来用python做简单处理。
rawin = {"showpassword":"no","bgcolor":"#ffffff"}
cookie_data = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw%3D"
result = unquote_plus(cookie_data)#将cookie按url解码
a=base64.b64decode(result)
b = json.dumps(rawin)
a = a.decode('utf-8')
xor=''
if len(a) < len(b):
i = 0
for ch in b:
xor = xor + chr((ord(ch) ^ ord(a[i % len(a)])))
i += 1
else:
i = 0
for ch in a:
xor = xor + chr((ord(ch) ^ ord(b[i % len(b)])))
i += 1
print(xor)
理论上我们就能获得key值你会发现xor=qw8Jqw8Jqw8Jqw8Js;9yzp7Jo:pJh1|qw8jlw6你会发现qw8j是循环的但是之后就出现了乱码,简单的判断的话的确qw8j就是key,事实也是如此。但是之后为什么会发生这样的问题呢,这是因为json字符串在python中符合好看的Python代码格式,所以我们会发现在{“showpassword”:“no”,“bgcolor”:"#ffffff"}中的,和:的前后被加上了空格,正是因此而导致错误。