Natas11 Writeup(常见编码、异或逆推、修改cookie)
Natas11:
页面提示cookie被异或加密保护,查看源码,发现了一个预定义参数和三个函数。
//预定义参数,猜测将showpassword设置为yes即可得到密码。 $defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff"); //异或加密函数 function xor_encrypt($in) { $key = '<censored>'; //预定参数key $text = $in; //输入参数 $outText = ''; //输出参数 // Iterate through each character for($i=0;$i<strlen($text);$i++) { //for循环,遍历输入参数 $outText .= $text[$i] ^ $key[$i % strlen($key)]; //将输入参数对应位和key对应位异或,key位数不够则从头循环,结果存到输出参数 } return $outText; //返回加密结果 } //加载函数:将$_COOKIE["data"]解密还原,存为 $mydata 数组,返回$mydata。 function loadData($def) { global $_COOKIE; $mydata = $def; if(array_key_exists("data", $_COOKIE)) { $tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true); if(is_array($tempdata) && array_key_exists("showpassword", $tempdata) && array_key_exists("bgcolor", $tempdata)) { if (preg_match('/^#(?:[a-f\d]{6})$/i', $tempdata['bgcolor'])) { $mydata['showpassword'] = $tempdata['showpassword']; $mydata['bgcolor'] = $tempdata['bgcolor']; } } } return $mydata; } //保存函数:将传入的参数,经过编码处理,存入$_COOKIE["data"]中。 function saveData($d) { setcookie("data", base64_encode(xor_encrypt(json_encode($d)))); } $data = loadData($defaultdata); if(array_key_exists("bgcolor",$_REQUEST)) { if (preg_match('/^#(?:[a-f\d]{6})$/i', $_REQUEST['bgcolor'])) { $data['bgcolor'] = $_REQUEST['bgcolor']; } } saveData($data); //将showpassword设置为yes即可得到密码 if($data["showpassword"] == "yes") { print "The password for natas12 is <censored><br>"; }
主要思路就是构造新的输入参数,使得"showpassword"=>"yes",编码后得到新的data。这就要求要知道key的值,而已有一个默认值,由此逆推得到key。
通过burp抓包,可以发现$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff")对应的data值为“ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=”。
我们知道,异或的逆操作还是异或。由此我们可以逆推得到key。$key = ’qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq’
<?php $defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff"); $data= 'ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw='; function xor_encrypt($in,$out) { $key ='' ; $text = $in; for($i=0;$i<strlen($text);$i++) { $key .= $text[$i] ^ $out[$i]; } return $key; } echo xor_encrypt(json_encode($defaultdata),base64_decode($data)); ?>
再利用key,构造新data。新data=ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK
<?php $defaultdata = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff"); function xor_encrypt($in) { $key = 'qw8J'; $text = $in; $outText = ''; // Iterate through each character for($i=0;$i<strlen($text);$i++) { $outText .= $text[$i] ^ $key[$i % strlen($key)]; } return $outText; } echo base64_encode(xor_encrypt(json_encode($defaultdata))); ?>
将新的data替换cookie中的data,点击Go,得到flag。
flag:EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
参考:https://www.cnblogs.com/ichunqiu/p/9554885.html