Natas25-writeup
前言
题目链接: http://natas25.natas.labs.overthewire.org
做这一题花了一些时间,也是由于自己知识点掌握不足,所以分享下解题过程。
题目分析
首先,登录后看到以下界面,是一篇文章的内容。右上角,language的地方可以选择语言,默认是英语,可以选择德语。当选择德语或英语后,可以看到URL请求会发送lang的参数。当我看到这里的时候先想到的是文章内容可能是读取的网站的文件内容,猜测通过目录遍历去直接查看/etc/natas_webpass/natas26的内容(此文件存放了下一关的密码)。(这边没有尝试,直接先查看了源代码,当然此关没这么简单,尝试结果也会是失败的。)


点击view sourcecode来解读下源代码。
可以看到一共有四个函数,分别是setLanguage、safeinclude、listFiles和logRequest。根据名称含义及代码大致猜测setlanguage是设置语言,safeinclude是文件包含的安全设置,listfile是罗列文件或查找文件(此函数其实并未完全理解,但大致理解为用于查找lang参数传入的文件路径),logrequest是用于写入安全日志。
大致理了下逻辑关系。
<?php foreach(listFiles("language/") as $f) echo "<option>$f</option>"; ?>
1、页面请求开始后,foreach函数会调用listfiles函数的返回结果作为变量f并输出。默认情况下就是我们一打开看到的英文文章。
<?php
session_start();
setLanguage();
echo "<h2>$__GREETING</h2>";
echo "<p align=\"justify\">$__MSG";
echo "<div align=\"right\"><h6>$__FOOTER</h6><div>";
?>
2、当页面上选择language后,调用setlanguage函数。之后就是几个函数的相互调用。
function ;
safeinclude("language/en");
}
3、Setlanguage函数将request中的lang参数丢给safeinclude函数,假如此时request中传递的lang参数为../../../../../etc/natas_webpass/natas25。经过拼接后传递给safeinclude函数的参数就变成了language/../../../../../etc/natas_webpass/natas25
function );
}
;
}
return ;
}
4、safeinclude函数将经过几次判断:
- 首先判断文件路径中是否包含"../",若包含则通过str_replace函数将"../"全部替换为空。并通过logrequest函数记录这次事件。这种过滤,如:将每个../替换为…/./,这种过滤是一次性的,不会对过滤的内再次校验,…/./过滤后就变成了../。
- 然后判断文件路径中是否包含了natas_webpass,若包含直接断开连接,并记录日志。这导致了直接访问natas_webpass/natas26的方法不可行了。
- 最后的判断则是包含文件,并返回内容了。
到此为止,我最开始的猜想证明错误了。这里我也卡了很久,毕竟刚开始学,知识匮乏(无奈。。。)
一开始我忽略了,logrequest函数记录日志这一过程,因为没看该函数内容前,一直以为日志记录的只是固定的字符串。但其实还有时间和requests请求中的user-agent字段。卡了很久后,无奈Google了一番,确认了新思路。利用user-agent进行注入,将natas26文件内容写入日志后,再通过目录遍历查看日志文件。
function logRequest($message){
$log="[". date("d.m.Y H::i:s",time()) ."]";#记录时间
$log=$log . " " . $_SERVER['HTTP_USER_AGENT'];#通过user-agent去包含natas26文件
$log=$log . " \"" . $message ."\"\n";
$fd=fopen("/var/www/natas/natas25/logs/natas25_" . session_id() .".log","a");#日志路径,目录遍历时用。
fwrite($fd,$log);
fclose($fd);
}
logrequest函数中有两个关键点:
$log=$log . " " . $_SERVER['HTTP_USER_AGENT'];
- 这条语句会将HTTP请求中的user-agent字段的内容,拼接到日志信息中。这里我采用了include函数去读取natas26文件内容。(这里并非只能用include,只要可以读取文件内容的方式应该都可以。)
$fd=fopen("/var/www/natas/natas25/logs/natas25_" . session_id() .".log","a");
- 日志存储的路径,以及日志文件名的命名规则。
开始解题
我使用了burpsuite来抓包和改包。设置好代理后,抓到请求包,并发送给repeater,开始构造所需的请求包。

主要有两处需要修改的地方:
- 构造lang参数去读取日志文件。
?lang=..././..././..././..././..././..././var/www/natas/natas25/logs/natas25_1hlck4sj7dasfhp0h05efhb9b1.log
?lang=..././logs/natas25_1hlck4sj7dasfhp0h05efhb9b1.log
这里,我列出了2种路劲。第一种路劲是返回到根目录,然后使用完整路径访问日志文件。第二种路劲是猜测logs目录和language目录属于同一级目录,所以返回至natas目录,然后访问logs目录下的日志文件。原理是一样的,只是当不知道目录之间的关系时,又知道完整路劲,就采用第一种方式。
- 构造user-agent参数去包含natas_webpass/natas26文件内容。
User-Agent: <?php include('/etc/natas_webpass/natas26') ?>
如图,其中PHPID也是关键,因为日志文件的命名是用到了PHPID。


构造好数据包后,发送请求,获得下一关的密码。(图片中密码抹掉了几位,建议动手尝试)
(可以看到第一次请求由于输错了路劲,导致include失败的信息也是写入了日志中。)

这里可以看到safeinclude函数,当"../"被替换后,会在日志中记录"Directory traversal attempt! fixing request."

当直接尝试访问/etc/natas_webpass/natas26时,会断开连接,没有返回内容,并会在日志中记录"Illegal file access detected! Aborting!"



以上就是整个natas25的解题过程了,当时主要是在user-agent的注入上花了点时间学习。

Natas25-writeup的更多相关文章
- Natas25 Writeup(目录遍历、头部注入)
Natas25: 打开页面,是一段引文以及可以选择语言的下拉list.查看源码,发现关键代码: function setLanguage(){ //选择语言 /* language setup */ ...
- Natas0-34 Writeup
Natas是一个教授服务器端Web安全基础知识的 wargame,通过在每一关寻找Web安全漏洞,来获取通往下一关的秘钥,适合新手入门Web安全. 传送门~ 接下来给大家分享一下,1-34题的Writ ...
- 2016第七季极客大挑战Writeup
第一次接触CTF,只会做杂项和一点点Web题--因为时间比较仓促,写的比较简略.以后再写下工具使用什么的. 纯新手,啥都不会.处于瑟瑟发抖的状态. 一.MISC 1.签到题 直接填入题目所给的SYC{ ...
- ISCC2016 WriteUp
日期: 2016-05-01~ 注:隔了好久才发布这篇文章,还有两道Pwn的题没放,过一阵子放上.刚开始做这个题,后来恰巧赶上校内CTF比赛,就把重心放在了那个上面. 这是第一次做类似于CTF的题,在 ...
- 参加 Tokyo Westerns / MMA CTF 2nd 2016 经验与感悟 TWCTF 2016 WriteUp
洒家近期参加了 Tokyo Westerns / MMA CTF 2nd 2016(TWCTF) 比赛,不得不说国际赛的玩法比国内赛更有玩头,有的题给洒家一种一看就知道怎么做,但是做出来还需要洒家拍一 ...
- 爱春秋之戏说春秋 Writeup
爱春秋之戏说春秋 Writeup 第一关 图穷匕见 这一关关键是给了一个图片,将图片下载到本地后,打开以及查看属性均无任何发现,尝试把图片转换为.txt格式.在文本的最后发现这样一串有规律的代码: 形 ...
- 《安全智库》:48H急速夺旗大战通关writeup(通关策略)
作者:ByStudent 题目名字 题目分值 地址 MallBuilder2 350 mall.anquanbao.com.cn MallBuilder1 200 mall.anquanbao.c ...
- iscc2016 pwn部分writeup
一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...
- We Chall-Training: Encodings I -Writeup
MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...
- We Chall-Encodings: URL -Writeup
MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...
随机推荐
- 洛谷 P1016 旅行者的预算
传送门 感觉自己连点生活常识都没有,竟然连油用过之后要减去都不知道,这种贪心模拟题都做不出来--思路在代码里,我菜死了 思路&&代码 //看题解过的..一点都没有成就感 #includ ...
- MacbookPro升级10.15 Catalina之后无法读写NTFS
冲着Sidecar的双屏功能,乐呵呵的跑去升级了10.15,结果就悲剧了. 所有移动硬盘和U盘都写不了,无奈只好上网找办法,目前找到一个便宜的方法: 共2步: Step 1:编写fstab文件 使用T ...
- VMWARE在UEFI下启动PE.ISO
1.编辑虚拟机设置→选项→高级→通过EFI而非BIOS引导勾选. 2.虚拟机→电源→打开电源时进入固件,进入之后修改光驱为第一引导. 3.挂载PE.ISO,启动时虚拟机顶部出现Press any ke ...
- 基于paramiko将文件上传到服务器上
通过安装使用paramiko模块,将本地文件上传到服务器上 import paramiko import datetime import os hostname = '服务器ip' username ...
- [LeetCode] 857. Minimum Cost to Hire K Workers 雇佣K名工人的最低成本
There are N workers. The i-th worker has a quality[i] and a minimum wage expectation wage[i]. Now w ...
- [LeetCode] 145. Binary Tree Postorder Traversal 二叉树的后序遍历
Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...
- Salesforce 版本控制 - VS Code + GitHub + Salesforce
使用VS Code开发Salesforce有个很好的地方是可以联接GitHub进行代码版本控制,点击查看使用VS Code开发SalesForce 第一步:安装GIthub Desktop Githu ...
- Nacos配置的多环境管理
实现多环境管理有下面几种方式 1.使用Data ID与profiles实现 在 Nacos Config Starter 中,dataId 的拼接格式为 ${prefix} - ${spring.pr ...
- vue + element 文件上传 并将文件转 base64
当时有一个需求 是需要用到上传文件这个功能,并且需要将文件转为 base64 给到后台.网上找的全是啥图片转base64 肯定是因为这类需求比较常见.当时有点懵了.后面一想,都他娘是文件啊.然后就找到 ...
- Scratch 3.6环境搭建(万江波实战记录)
1.Scratch官网在线环境 官方网址:scratch.mit.edu 进入后,点击“Create”建立 2. Scratch官网在线环境_简体中文(点击这个地球) 3-选择:创意 4-进入”创意“ ...