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 ...
随机推荐
- wal2json java jdbc 试用
上边有介绍过使用命令行模式的wal2json扩展使用,以下是一个jdbc 集成的试用(pg jdbc 驱动天然支持复制) 环境准备 pg(包含wal2json扩展)docker-compose 文件 ...
- 5.Vue的组件
1.什么是组件 组件是可复用的Vue实例,也就是一组可以复用的模版,类似JSTL的自定义标签. 你可能会有页头.侧边栏.内容区等组件,每个组件又包含了其它的像导航链接.博文之类的组件. 2.第一个Vu ...
- Linux性能优化实战学习笔记:第四十五讲
一.上节回顾 专栏更新至今,四大基础模块的最后一个模块——网络篇,我们就已经学完了.很开心你还没有掉队,仍然在积极学习思考和实践操作,热情地留言和互动.还有不少同学分享了在实际生产环境中,碰到各种性能 ...
- MySQL实战45讲学习笔记:第二十八讲
一.读写分离架构 在上一篇文章中,我和你介绍了一主多从的结构以及切换流程.今天我们就继续聊聊一主多从架构的应用场景:读写分离,以及怎么处理主备延迟导致的读写分离问题. 我们在上一篇文章中提到的一主多从 ...
- [LeetCode] 673. Number of Longest Increasing Subsequence 最长递增序列的个数
Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...
- [LeetCode] 286. Walls and Gates 墙和门
You are given a m x n 2D grid initialized with these three possible values. -1 - A wall or an obstac ...
- ConcurrentHashMap竟然也有死循环问题?
前几天和朋友闲聊,说遇到了一个ConcurrentHashMap死循环问题,当时心里想这不科学呀?ConcurrentHashMap怎么还有死循环呢,毕竟它已经解决HashMap中rehash中死循环 ...
- Qt 简易图片播放器
一.前言 使用 Qt 制作了一个简单的图片播放器,点击 "浏览按钮" 浏览图片所在目录,目录中的所有图片缩小图标和名称会显示在左侧的图片列表中,点击列表中的图片项,可以在右侧区域的 ...
- I/O多路复用-EPOLL探索
什么是I/O多路复用 I/O多路复用就是通过一种机制,可以监视多个描述符,一旦某个IO能够读写,通知程序进行相应的读写操作. I/O多路复用的场合 1.当客户处理多个描述字时(通常是交互式输入和网络套 ...
- LeetcCode 27:移除元素 Remove Element(python、java)
公众号:爱写bug 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) ...