Category Archives: php

OverTheWire – Natas level 13 was not that hard

hey there,

people learn from their mistakes, so does Natas. They have heard that instead of .jpg we were able to upload any file, so they just made some changes and “improved” their security for this level. have they even heard about magic numbers? today they are gonna do their magic for us.

first just open your terminal and hexdump any .jpg file.  I have just found this cutie in my laptop, so gonna see how .jpg files differ from the other ones.  so, I’m gonna type: xxd -C nameofthephoto.jpg

pay attention to the first bites of the hexdump:ffd8 ffe0 00
these are the magic numbers for .jpg. and they are here for us today. we can convince the server that the file, that we are uploading, is a pure .jpg as it wishes. (ssshhh, don’t tell anyone, we are going to upload a wonderful .php that will lead us to our password)
do you remember the script (natas13.php) that we wrote together for the last level ? bring it back, we need it today as well. you have to make some changes though:

echo file_get_contents( “/etc/natas_webpass/natas14 “);

and now let’s make a .jpg file just to have the magic numbers in it: 

echo -e “xffxd8xffxe0n” > newfile.jpg

we should merge these two files: 

cat natas13.php >> newfile.jpg

the rest is the same. upload the file, change the name into .php (now you like burp suite more, right?) and enjoy the moment. come back for the next level.

I thought it’s supposed to be easier…

Today I solved OverTheWire – Natas level 12

hey there, 

the older we get the harder the life is. here in OverTheWire it’s a bit different. so level 12 is much easier if you’ve already passed the other 11 levels. (Good for you, by the way! what a journey, huh?!)

have you already read the script? actually, there is nothing new for us. we can get the same from the page: you should upload a .jpg file not bigger than 1KB. let’s try it. 

before that, do you have burp suite? you’re gonna need it. I should  confess, at first I hated it. now it’s one of my best friends. please, download it and come back…I’ll wait. if you have it already, you need to know how it works, right? Here I’ve found a tutorial for you to be quick, but I’ve learned it and in like 5 hours with this crazy guy.

I made just a random .txt file and tried to upload it to see what is happening when you don’t upload the required .jpeg. 

Have you noticed? it has transferred it into .jpg. Let’s see if we can transfer it into .txt again. and click on the uploaded file: 

voila! it reads the text file. this is so bad… so bad… this is my friend File inclusion vulnerability. what if we create a PHP file because we know that the server supports PHP. no worries, this is going to be easy, you just need one command: file_get_contents, and we already know where the password is right: /etc/natas_webpass/natas13. it should look like this: 

echo file_get_contents( “/etc/natas_webpass/natas13 “);

save the file as natas12.php and upload it. then just go back to your close friend burp suit and change the .jpg into .php, click forward. what do you think? what will happen if you open the uploaded file? do it yourself, I trust you! see you on the next level.
I thought it’s supposed to be easier…

How I suffered to hack OverTheWire – Natas level 11

hey there,

so you have already passed all the previous levels, congrats, you are good to go! it’s getting a bit complicated from now on. No worries! I’m here to make it easier for you. Now we are on level 11, and I hope you have the password.

What do we see here?

you already know what to do, right? let’s see what the sourcecode says:
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");

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;

$defaultdata array contains two values: showpassword and bgcolor. (you do see that “no”, do you? we are gonna change that to “yes”)
what is on the next line? xor_encrypt? what a new hell is this? let me explain: XOR Encryption is like two salads with one same ingredient – the key. in both cases (Encryption and Decryption) the key stays the same. if the plain text has the same length as the key, it’s used once, if not – key is repeated. here I’ve found a very simple explanation of the concept for you.
now that we know what xor encryption means, let’s go on and look at the rest of the sourcecode.
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-fd]{6})$/i', $tempdata['bgcolor'])) {
$mydata['showpassword'] = $tempdata['showpassword'];
$mydata['bgcolor'] = $tempdata['bgcolor'];
return $mydata;
what does it say? look at the 5th line.
$tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE[“data”])), true);
hah! Cookie? So we must pay attention to the cookies, there should be something for us.

"Cookies are protected with XOR encryption" says the page. not only that, if you've already paid some attention, $tempdata has played some games: json_decode,  xor_encrtpt and then base64_decode. What we can do is to start from the end. 

1) base64 decoding our favorite line of the cookies (base64 -d)
2) in order to be able to do some xor_encrtypt, we need a hexdump, so
3) base64 -d | xxd -p
note: you’ll see %3D at the end of the cookie, which is URL encoding, basically it is  a =, so replace that part with =.
the result should look like this:
4) now we have the output of our xor_encrypt and we need the plain text to be able to find out the key.
here comes some php coding copy-pasting (don’t worry if you can’t code in php and remember, you just need to understand what’s written in there)
just create a php file and type or copy-paste the following.


$in = array( “showpassword”=>”no”, “bgcolor”=>”#ffffff”);



the output is going to be our input for the XOR encryption.


the world is full of encrypting – decrypting websites. here is one:
voila! we have our key: qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq
if you remember, I have already told you, that in case the key is short, it is repeated. so the exact key is: qw8J
our crazy mind says: go and copy some other code out there.
go back to your php file and do some edits. I had told you we were gonna make the “no” into a very nice “yes”.
execute the file, and you will see a whole another cookie there:


what is required is to replace the previous one with this new, much better one. and please, don’t forget to add %3D at the end. the rest is on you! enjoy the moment of seeing the password on your screen. you deserve it! 

I thought it’s supposed to be easier…