본문 바로가기

보안/Natas

Natas Level 11 - XOR


Natas Level 10 → Level 11
 
Username: natas11
URL:      http://natas11.natas.labs.overthewire.org

 

 

<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>";
}

?>

<form>
Background color: <input name=bgcolor value="<?=$data['bgcolor']?>">
<input type=submit value="Set color">
</form>

<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>

 

 

정작 실행하는 코드는 3줄이다.

 

 

 

 

$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);

 

암호화된 값을 풀었다가 색설정하고 다시 암호화해서 쿠키에 저장하는 코드같다.

값의 의미는 중요하지 않은 것 같고 XOR만 잘해주면 될 거같다.

 

{
    "showpassword": "yes,

    "bgcolor": #111111

}

 

이렇게 끝나면 된다.

나는 현재 키를 모르므로 키부터 알아내야한다. 색깔을 #111111로 했을 때 돌아오는 쿠키 값을 획득한 뒤 파이썬 코드로 실행한다.

 

 

import base64
import json


enc_Key = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSRgl7QEYJaAw="
enc_Key = base64.b64decode(enc_Key)

enc_Text = {"showpassword" : "no", "bgcolor" : "#111111"}
enc_Text = json.dumps(enc_Text)

enc_outText = ""
for i in range(0, len(enc_Text)) :
 enc_outText += chr(ord(enc_Text[i]) ^  ord(enc_Key[i % len(enc_Key)]))


print enc_outText

 

이 코드를 실행하면 반복되는 문자열이 있는데 이 값이 키다 : qw8J

 

이제 다시 쿠키값을 만들기 위해 파이썬코드를 작성했다

 

import base64
import json

 

key = "qw8J"
text = {"showpassword" : "yes", "bgcolor" : "#111111"}
text = json.dumps(text)
outText = ''

for i in range(0, len(text)) :
 outText += chr(ord(text[i]) ^  ord(key[i % len(key)]))

print base64.b64encode(outText)

 

 

 

출력된 값을 넣은 결과 정상적으로 12번답을 알 수 있었다.

 

 

 

 

 

답은 EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3 이다,