前言

  题目链接: 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的更多相关文章

  1. Natas25 Writeup(目录遍历、头部注入)

    Natas25: 打开页面,是一段引文以及可以选择语言的下拉list.查看源码,发现关键代码: function setLanguage(){ //选择语言 /* language setup */ ...

  2. Natas0-34 Writeup

    Natas是一个教授服务器端Web安全基础知识的 wargame,通过在每一关寻找Web安全漏洞,来获取通往下一关的秘钥,适合新手入门Web安全. 传送门~ 接下来给大家分享一下,1-34题的Writ ...

  3. 2016第七季极客大挑战Writeup

    第一次接触CTF,只会做杂项和一点点Web题--因为时间比较仓促,写的比较简略.以后再写下工具使用什么的. 纯新手,啥都不会.处于瑟瑟发抖的状态. 一.MISC 1.签到题 直接填入题目所给的SYC{ ...

  4. ISCC2016 WriteUp

    日期: 2016-05-01~ 注:隔了好久才发布这篇文章,还有两道Pwn的题没放,过一阵子放上.刚开始做这个题,后来恰巧赶上校内CTF比赛,就把重心放在了那个上面. 这是第一次做类似于CTF的题,在 ...

  5. 参加 Tokyo Westerns / MMA CTF 2nd 2016 经验与感悟 TWCTF 2016 WriteUp

    洒家近期参加了 Tokyo Westerns / MMA CTF 2nd 2016(TWCTF) 比赛,不得不说国际赛的玩法比国内赛更有玩头,有的题给洒家一种一看就知道怎么做,但是做出来还需要洒家拍一 ...

  6. 爱春秋之戏说春秋 Writeup

    爱春秋之戏说春秋 Writeup 第一关 图穷匕见 这一关关键是给了一个图片,将图片下载到本地后,打开以及查看属性均无任何发现,尝试把图片转换为.txt格式.在文本的最后发现这样一串有规律的代码: 形 ...

  7. 《安全智库》:48H急速夺旗大战通关writeup(通关策略)

    作者:ByStudent   题目名字 题目分值 地址 MallBuilder2 350 mall.anquanbao.com.cn MallBuilder1 200 mall.anquanbao.c ...

  8. iscc2016 pwn部分writeup

    一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...

  9. 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 ...

  10. 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 ...

随机推荐

  1. 学习-velocity

    Velocity是什么?  Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码 ...

  2. [学习笔记] 网络最大流的HLPP算法

    #define \(u\)的伴点集合 与\(u\)相隔一条边的且\(u\)能达到的点的集合 \(0x00~ {}~Preface\) \(HLPP(Highest~Label~Preflow~Push ...

  3. 本地手动一步步搭建WNMP环境(nginx+php+mysql) Windows平台

    环境:Windows 10 x64 参考文章: WNMP完整教程      windows下PHP环境的搭建 我自定义安装后的目录结构: +WNMP ++MySQL_Server-8.0.13 ++n ...

  4. SpringCloud Feign 参数问题

    今天遇到使用Feign调用微服务,传递参数时遇到几个问题 1.无参数 以GET方式请求 服务提供者 @RequestMapping("/hello") public String ...

  5. BizTalk证书相关操作

    OPEN SSL 神技能 从PFX文件中导出私钥 openssl pkcs12 -in Cert.pfx -nocerts -nodes -out private_pc.key 从PFX文件中导出CS ...

  6. HTML连载27-层叠性&优先级&!important用法

    一.层叠性 1.定义:CSS处理冲突的一种能力 2.注意点:层叠性只有在多个选择器中“同一标签”,然后又设置了“相同的属性”,才会发生层叠性 3.CSS缩写:Cascading StyleSheet ...

  7. Composer 入门后,接下来该看看这篇文章了

    上篇文章,我们了解了 Composer 的包是如何开发的,过程中我们使用了 composer init. composer install. composerrequire. composer con ...

  8. java中 Math和StrictMath

    今天无意中看到java api中有StrictMath 这个工具类,发现它部分调用实现是用了Math中的实现.Math 这个类API 1.0版本就有了,StrictMath API是1.3版本才出来的 ...

  9. 数据库的dml、ddl和dcl的概念

    学过数据库肯定会知道DML.DDL和DCL这三种语言,这种基础概念性的东西是必须要记住的. DML(Data Manipulation Lanaguage,数据操纵语言) DML就是我们经常用到的SE ...

  10. IntelliJ idea 撤回(已经commit未push的)操作

    VSC  => Git => reset head => 退回到上次commit => 退回到第2次提交之前 => 退回到指定commit版本