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 ...
随机推荐
- 使用PAC文件来管理代理连接
生成PAC文件 谷歌浏览器插件商店安装SwitchyOmega,找到立即更新模式,然后导出PAC文件 使用PAC文件 pac采用js编写 Windows Windows上面使用PAC文件很简单,新建一 ...
- Idea用maven给springboot打jar包
一.准备工作 1.工具:Idea2018,maven3.5 2.首先得保证pom有maven插件 <plugin> <groupId>org.springframework.b ...
- Kafka如何保证高吞吐量
1.顺序读写 kafka的消息是不断追加到文件中的,这个特性使kafka可以充分利用磁盘的顺序读写性能 顺序读写不需要硬盘磁头的寻道时间,只需很少的扇区旋转时间,所以速度远快于随机读写 生产者负责写入 ...
- Javascript笔记:作用域和执行上下文
一.作用域 Javascript的作用域规则是在编译阶段确定的,有声明时的位置决定. JS中有全局作用域,函数作用域,块级作用域(ES6引入). 1. 全局作用域 在整个程序生命周期内都是有效的,在任 ...
- java包学习之IO
第一 java IO的专题 第二 编码 1.从桌面创建内容为“联”的txt,打开为乱码开始讲起,原因是我们的电脑默认是创建ansi编码的,但是“联”字比较特别,编码会被认为是utf-8的,所以会出现乱 ...
- 如何定时查询某线程的CPU执行时间
#!/bin/bash pid=$(ps -T -p $(pgrep xxx) | grep xxx | gawk -F" " '{print $2}') if [ -z $pid ...
- The multi-part request contained parameter data (excluding uploaded files) that exceeded the limit for maxPostSize set on the associated connector.
springboot 表单体积过大时报错: The multi-part request contained parameter data (excluding uploaded files) tha ...
- 【C++】如何使用GCC生成动态库和静态库
一.静态库和动态库的定义及区别 程序编译的四个过程: 1.预处理 展开头文件/宏替换/去掉注释/条件编译(.i后缀) 2.编译 检查语法,生成汇编(.s后缀) 3.汇编 汇编代码转换成机 ...
- Prometheus 与 Alertmanager 通信
Prometheus 与 Alertmanager 通信 1.编辑Prometheus配置文件配置连接地址:vim prometheus.yml # Alertmanager configuratio ...
- 使用Jenkins来实现内部的持续集成流程(下)
目录 配置项目构建 添加任务 添加源代码地址和登录凭据 添加构建触发器 TFS添加WebHook 添加构建步骤 后端UI API端 配置项目构建 1.添加任务 2.添加源代码地址和登录凭据 添 ...