MoeCTF wp


image-20200816135721888

MoeCTF,西安电子科技大学的新生赛,作为一个南邮的小菜鸡,成功通过wh1sper师傅提供的后门混入其中:wink:,借此锻炼锻炼自己的能力,同时也为0xGame做准备。冲冲冲!

1.GET

这是一道简单的get传参的题,直接在url里传a这个参数?a=flag,即可得到flag


2.POST

这是一道简单的post传参的题,利用hackbar(火狐浏览器的插件,不了解的话可自行百度一下,安装啥的不难的)即可传参,或者利用bp应该也是一样的。

image-20200814140353992

3.小饼干

进入页面发现是一个空页面,这时候想到利用bp抓包,观察

image-20200814140801922

发现类似flag的东西。复制提交,发现就是正确的flag


4.Introduction

这个题点进去的话就是很正常的对moectf的介绍,点进去源码也没看到flag (好吧,是我眼瞎,后来才发现flag就在源码里) 尝试抓包,也没找到

image-20200814142428514

考的是眼力:imp:


5.一句话木马

进入题目,发现源码就是一句话木马

image-20200814142846791

话不多说,直接掏出俺的蚁剑

image-20200814143147631

这边的话要注意的就是连接密码一定别忘记,密码就是post后面单引号里的内容

image-20200814143913525

连接成功!一般情况下flag就在根目录/下,去到这道题的根目录下的确发现了flag。


6.ezmath

等待填坑


7.三心二意

根据hint及观察代码,这应该是一道考察php弱类型相等的题。

<?php
$a = $_GET['a'];
$b = $_POST['b'];
$c = $_REQUEST['c'];
$d = $_COOKIE['d'];

if (!isset($a, $b, $c, $d)) {
    highlight_file(__FILE__);
} else {
    if (is_numeric($a) and $a == false) {
        echo 'A is OK!';
        echo '<br/>';
        if (!is_numeric($b) and $b == 0x125e591) {
            echo 'B is OK!';
            echo '<br/>';
            if ($c != 240610708 and md5($c) == md5(240610708)) {
                echo 'C is OK!';
                echo '<br/>';
                if (strlen($d) < 7 and $d != 0 and $d ** 2 == 0) {
                    include('/flag');
                } else {
                    echo "D is not wanted.<br/>";
                    highlight_file(__FILE__);
                }
            } else {
                echo "C is not wanted.<br/>";
                highlight_file(__FILE__);
            }
        } else {
            echo "Too young too simple.<br/>";
            highlight_file(__FILE__);
        }
    } else {
        echo "A is not wanted.<br/>";
        highlight_file(__FILE__);
    }
} 

u1s1,我刷题的确太少了,对于题目中的几个判断都不是很熟悉,不知道怎么去绕过,一个一个做解释吧:cry:

  • is_numeric($a) and $a == false

此处涉及到**is_numeric()**这个php函数,is_numeric() 函数用于检测变量是否为数字或数字字符串,如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。

也就是说上面这个语句要求a参数是一个数字或字符串,且==false,那挺简单的,0或者null都可以,尝试?a=0,回车一下发现没反应,仔细看源码才发现他要a,b,c,d四个变量都存在才行。

  • !is_numeric($b) and $b == 0x125e591

    这个语句的要求是b变量不是数字或字符串并且b==0x125e591,关于0x125e591,我也不太清楚他是个啥,看起来像16进制,百度一波

    image-20200921134750652

    好家伙!直接给我转换出来了。没错了,0x125e591是16进制,转成10进制就是19260817。

    php有两种比较方式,一种是“= =”一种是“= = =”

    “= =”:会把两端变量类型转换成相同的,再进行比较。

    “= = =”:会先判断两端变量类型是否相同,再进行比较。

    这里明确说明,在两个相等的符号中,一个字符串与一个数字相比较时,字符串会转换成数值

    当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含’.’,’e’,’E’并且其数值值在整形的范围之内,该字符串被当作int来取值。其他所有情况下都被作为float来取值,该字符串的 开始部分 决定了它的值,如果该字符串以合法的数值开始,则使用该数值, 否则其值为0 。

    在进行比较运算时,如果遇到了 0e 这类字符串,PHP会将它解析为 科学计数法

    在进行比较运算时,如果遇到了 0x 这类字符串,PHP会将它解析为 十六进制 。

    然后经过大佬指点和我的测试,我发现只需要在19260817后面加上字母就行了:smile_cat:

  • $c != 240610708 and md5($c) == md5(240610708)

    这个的话主要是md5值的知识,上网一查,md5(‘240610708’)等于md5(‘QNKCDZO’),于是直接吧c赋值成后面那个字符串。

  • strlen($d) < 7 and $d != 0 and $d ** 2 == 0

    这个一开始是真的不会,后来还是一个学弟教我的,害。

    考点应该是md5()函数无法处理数组,如果传入的为数组,会返回NULL(之前应该遇到过,忘记了。。。)

    所以此处将d赋值成d[]=0,妙啊。

    所以最终传参如下:

    image-20200921143630484

再贴一道与这道题很像的题:(来自CNSS)

<?php
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_POST['b'];
$c = $_REQUEST['c'];
$d = $_COOKIE['d'];

if (isset($a) && !is_numeric($a) && $a == 114514) {
    echo "A is ok!";
    if (isset($b) && $b != 0 && $b ** 2 == 0) {
        echo "B is ok!";
        if (isset($c) && isset($d) && $c !== $d && md5($c) === md5($d)) {
            echo "C is ok!";
            echo "Here is your flag:";
            include('/flag');
        } else {
            die((isset($c) && isset($d)) ? "Try to search something?" : "C and D is wanted.");
        }
    } else {
        die(isset($b) ? "You need to try again." : "B is wanted.");
    }
} else {
    die(isset($a) ? "Please try another a." : "A is wanted.");
} 

8.俄罗斯头套

image-20200814145058030

点进去后发现这样一句话,觉得应该得burpsuits伪造一波ip地址

image-20200814145154603

抓包后添加 X-Forwarded-For头,伪造一波ip地址,send一下,得到如下页面

image-20200814145736400

然后注意到response里说我得是从https://www.baidu.com来的,根据之前的做题经验的话,再添加一个**Referer**头即可,如下:

image-20200814150025874

发现response里又要求使用Post请求,这个之前的确没遇到过,观察了一波现有的头,发现第一个头是Get,尝试将其修改为Post后send一波,得到如下信息:

image-20200814150414403

好吧,没完了,不愧是俄罗斯头套😢 不过supreme浏览器是什么鬼,我去百度了一波,靠,好像还真有这个浏览器,不会吧,不会吧,不会要去用这个浏览器去解题吧,那样还得重新配置burpsuits.

我去百度了一波burpsuits里浏览器是由哪个头去表示的,发现是由user-Agent去决定的,

image-20200814150944737

仔细看了看burpsuits里那个头的内容,发现了一个Firefox,盲猜指的是所用的firefox浏览器,尝试将它改为题目中要求的supreme浏览器, 成功!


9.Moe include

看这题目标题,应该和文件包含漏洞有关,点进去看一下:

image-20200816140535894

让我别点,那一定得点一下了😝

image-20200816140646912

发现回显的页面为空,但是注意到url里多了一个?file=hint.php

hint是提示的意思,访问hint.php试试,回显的依旧是空页面,抓包看看:

image-20200816141033076

看到注释:你知道php伪协议吗?

不知道的话可以参考参考这篇博客:php伪协议总结

文件包含直接读取的是文件,而不是文件源码,所以要想办法读取源码.结合之前的做题经验,尝试了一下用php://filter去读取文件

尝试构造如下paylaod:?file=php://filter/read=convert.base64-encode/resource=flag.php

image-20200816142441015

然后对得到的字符串进行base64解密即可得到flag.😎


10.Moe unserialize

等待填坑


11.EzXXE

等待填坑


文章作者: Ab4nd0n
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ab4nd0n !
评论
  目录