OverTheWire的natas游戏(11)

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'] 最后saveDatadata 保存起来。

那么关键就是要让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 PlainKey=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 PlainKeyKey=CipherKey

∴ P l a i n = C i p h e r ⨁ K e y \therefore Plain = Cipher \bigoplus Key Plain=CipherKey

什么意思呢?用人话来说就是我们只要知道了KeyCipher就能求得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 DefaultdataKey=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 DefaultdataDefaultdataKey=DefaultdataData

∴ K e y = D e f a u l t d a t a ⨁ D a t a \therefore Key = Defaultdata \bigoplus Data Key=DefaultdataData

非常明了吧,得到的Output就是所谓的Key了,很明显看得出来是key是4位。接下来怎么做就很清晰了吧?

在这里插入图片描述

拿着输出结果修改一下Cookie刷新一下答案就出来了

在这里插入图片描述

The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值