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 ...
随机推荐
- tuned linux 性能调优工具
tuned 是redhat 提供的一套系统调优工具,使用简单,同时也提供了比较全的分类. 参考资料 https://github.com/redhat-performance/tuned
- requests--Cookie设置
前戏 有些页面需要登录才可以访问,而服务器是根据cookie来进行判断的,服务器拿到浏览器的cookie,然后再数据库里进行查询判断,如果校验通过,则服务器认为是登录过的,才有继续访问的权限,否则,服 ...
- 「总结」插头$dp$
集中做完了插头$dp$ 写一下题解. 一开始学的时候还是挺蒙的. 不过后来站在轮廓线$dp$的角度上来看就简单多了. 其实就是一种联通性$dp$,只不过情况比较多而已了. 本来转移方式有两种.逐行和逐 ...
- linux数据库中使用MD5加密
MD5加密算法源码下载:https://pan.baidu.com/s/1nwyN0xV 下载完成了之后解压,得到两个文件 环境搭建: 1.把md5.h文件拷贝到/usr/include/目录下 su ...
- springcloud(六,多个服务提供者)
spring cloud (一.服务注册demo_eureka) spring cloud (二.服务注册安全demo_eureka) spring cloud (三.服务提供者demo_provid ...
- 推荐一款健康App 多喝水,引领全民时尚喝水生活习惯
推荐一款健康App 多喝水,引领全民时尚喝水生活习惯 1 介绍 多喝水,一款鼓励大众喝水的APP.我们倡导大众健康生活,培养人们爱喝水的习惯,让每一次喝水,都能产生价值,让人们在喝水的同时,可享受赚钱 ...
- Visual Studio 2019(VS2019)下载极慢的问题
今天给新电脑安装 vs2019,下载速度只有 TMD 10kb/s,实在忍无可忍,在经过了一系列的百度之后,找到解决方法. 具体方法很简单: 用站长工具查询了一下 download.visualstu ...
- 解决vue刷新页面以后丢失store的数据
刷新页面时vue实例重新加载,store就会被重置,可以把定义刷新前把store存入本地localStorage.sessionStorage.cookie中,localStorage是永久储存,重新 ...
- go-gin-api 路由中间件 - 签名验证(七)
概览 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(实战篇),文章反响真是出乎意料, 「Go中国」 公众号也转发了,有很多朋友加我好友交流,直呼我大神,其实我哪是什么大 ...
- SQL --------------- 运算符 = 与 in
in 用于指定查询与where 一块进行使用,可以用来指定一个或多个,和 “ = ” 差不多 语法: select * from 表名 where 字段 in (字段对应的值可以是一个或多个) 建个表 ...