MoeCTF,西安电子科技大学的新生赛,作为一个南邮的小菜鸡,成功通过wh1sper师傅提供的后门混入其中:wink:,借此锻炼锻炼自己的能力,同时也为0xGame做准备。冲冲冲!
1.GET
这是一道简单的get传参的题,直接在url里传a这个参数?a=flag
,即可得到flag
2.POST
这是一道简单的post传参的题,利用hackbar(火狐浏览器的插件,不了解的话可自行百度一下,安装啥的不难的)即可传参,或者利用bp应该也是一样的。
3.小饼干
进入页面发现是一个空页面,这时候想到利用bp抓包,观察
发现类似flag的东西。复制提交,发现就是正确的flag
4.Introduction
这个题点进去的话就是很正常的对moectf的介绍,点进去源码也没看到flag (好吧,是我眼瞎,后来才发现flag就在源码里) 尝试抓包,也没找到
考的是眼力:imp:
5.一句话木马
进入题目,发现源码就是一句话木马
话不多说,直接掏出俺的蚁剑
这边的话要注意的就是连接密码一定别忘记,密码就是post后面单引号里的内容。
连接成功!一般情况下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进制,百度一波
好家伙!直接给我转换出来了。没错了,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
,妙啊。所以最终传参如下:
再贴一道与这道题很像的题:(来自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.俄罗斯头套
点进去后发现这样一句话,觉得应该得burpsuits伪造一波ip地址
抓包后添加 X-Forwarded-For头,伪造一波ip地址,send一下,得到如下页面
然后注意到response里说我得是从https://www.baidu.com来的,根据之前的做题经验的话,再添加一个**Referer**头即可,如下:
发现response里又要求使用Post请求,这个之前的确没遇到过,观察了一波现有的头,发现第一个头是Get,尝试将其修改为Post后send一波,得到如下信息:
好吧,没完了,不愧是俄罗斯头套😢 不过supreme浏览器是什么鬼,我去百度了一波,靠,好像还真有这个浏览器,不会吧,不会吧,不会要去用这个浏览器去解题吧,那样还得重新配置burpsuits.
我去百度了一波burpsuits里浏览器是由哪个头去表示的,发现是由user-Agent去决定的,
仔细看了看burpsuits里那个头的内容,发现了一个Firefox,盲猜指的是所用的firefox浏览器,尝试将它改为题目中要求的supreme浏览器, 成功!
9.Moe include
看这题目标题,应该和文件包含漏洞有关,点进去看一下:
让我别点,那一定得点一下了😝
发现回显的页面为空,但是注意到url里多了一个?file=hint.php
hint是提示的意思,访问hint.php试试,回显的依旧是空页面,抓包看看:
看到注释:你知道php伪协议吗?
不知道的话可以参考参考这篇博客:php伪协议总结
文件包含直接读取的是文件,而不是文件源码,所以要想办法读取源码.结合之前的做题经验,尝试了一下用php://filter
去读取文件
尝试构造如下paylaod:?file=php://filter/read=convert.base64-encode/resource=flag.php
然后对得到的字符串进行base64解密即可得到flag.😎
10.Moe unserialize
等待填坑
11.EzXXE
等待填坑