natas solution(11)
Username: natas11
URL: http://natas11.natas.labs.overthewire.org
全部的源码就不放上来了,实在有点多
<?
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
$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);
?>
<h1>natas11</h1>
<div id="content">
<body style="background: <?=$data['bgcolor']?>;">
Cookies are protected with XOR encryption<br/><br/>
<?
if($data["showpassword"] == "yes") {
print "The password for natas12 is <censored><br>";
}
?>
大概的逻辑就是通过loadData
把 $_COOKIE["data"]
加密一次后,赋值给$data
通过检查后把我们输入的颜色值赋值给 data['bgcolor']
最后saveData
把 data
保存起来。
那么关键就是要让showpassword等于yes 。可是该怎么改变showpasword呢?
其实关键只在于第一行,我们的data是从 $_COOKIE
得到的,甚至showpassword也是从 $_COOKIE
得到的。
那么我们只需要修改 $_COOKIE["data"]
就好了
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 。
那么这个值该如何使用呢?我们先来学习异或
∵ P l a i n ⨁ K e y = C i p h e r \because Plain \bigoplus Key = Cipher ∵Plain⨁Key=Cipher
∴ P l a i n ⨁ K e y ⨁ K e y = C i p h e r ⨁ K e y \therefore Plain \bigoplus Key \bigoplus Key = Cipher \bigoplus Key ∴Plain⨁Key⨁Key=Cipher⨁Key
∴ P l a i n = C i p h e r ⨁ K e y \therefore Plain = Cipher \bigoplus Key ∴Plain=Cipher⨁Key
什么意思呢?用人话来说就是我们只要知道了Key和Cipher就能求得Plain
理解之后我们需要认真理解跟最后COOKIE有关的代码saveData
function saveData($d) {
setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
}
众所周知decode只需要和encode倒过来就行了。先base64解一下码,在xor即可。过程如下
我们套回上面的公式,图中的Key是Defaultdata,图中的Input是Data
∵ D e f a u l t d a t a ⨁ K e y = D a t a \because Defaultdata \bigoplus Key = Data ∵Defaultdata⨁Key=Data
∴ D e f a u l t d a t a ⨁ D e f a u l t d a t a ⨁ K e y = D e f a u l t d a t a ⨁ D a t a \therefore Defaultdata \bigoplus Defaultdata \bigoplus Key = Defaultdata \bigoplus Data ∴Defaultdata⨁Defaultdata⨁Key=Defaultdata⨁Data
∴ K e y = D e f a u l t d a t a ⨁ D a t a \therefore Key = Defaultdata \bigoplus Data ∴Key=Defaultdata⨁Data
非常明了吧,得到的Output就是所谓的Key了,很明显看得出来是key是4位。接下来怎么做就很清晰了吧?
拿着输出结果修改一下Cookie刷新一下答案就出来了
The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3