【攻防世界】–warmup—(详细操作)做题笔记

【攻防世界】–warmup—(详细操作)做题笔记

为了让自己记忆更深刻,查询跟资料更方便,开始试着写博客,新手菜鸟,思路有不正确的地方,还请各位大佬不吝啬指正,感谢。下面开始做题:

首先我们先用御剑扫描,发现并没有其他多余的网站供我们查看,就扫描到了一个网站,如图:

【攻防世界】--warmup---(详细操作)做题笔记

进到网页以后显示如图:

【攻防世界】--warmup---(详细操作)做题笔记

只有本网页,啥也点击不了,只有一张图片,那么我们利用F12或者ctrl+shift+i打开,打开后的如图:

【攻防世界】--warmup---(详细操作)做题笔记

提示我们source.php,看到.php应该是网页后缀,尝试两次之后发现后缀需要放到这里才行,

【攻防世界】--warmup---(详细操作)做题笔记

可以看到这段代码如下,我不太了解=>就参考了大佬写的文章,大概意识就是表示左边是键,右边是值,理解来源PHP中-和=的意思 – 百度文库。

 <?php
    highlight_file(__FILE__);
   //__FILE__常量返回文件的完整路径和文件名,并亮度高显示
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
           #白名单 给whitelist设置为数组,里面包含了两种数组,左边为按键,右边为数值。
            if (! isset($page) || !is_string($page)) {
            //||表示逻辑运算符OR,非isset()与非is_string()其中有一个是真变为真。
                echo "you can't see it";
                return false;
            }
            if (in_array($page, $whitelist)) {
             //$把page对比whitelist中的数组,在当中,则输出true。
                return true;
            }
            $_page = mb_substr( 
            //mb__substr函数在php中式截取字符串的函数
                $page,   //要截取的字符串
                0,    //起始位置
                mb_strpos($page . '?', '?')//截取的长度
               //返回?在$page.?字符串首次中出现的位置
            );
            if (in_array($_page, $whitelist)) {
            //如果在白名单中
                return true;
            }
            $_page = urldecode($page);//解码运算
            $_page = mb_substr(
                $_page,//要截取的字符串
                0,//起始的位置
                mb_strpos($_page . '?', '?')//截取的长度
               //返回在$page.?字符串中首次出现的位置
            );
            if (in_array($_page, $whitelist)) {
              //如果$_page出现在数组中whitelist中
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }
    if (! empty($_REQUEST['file'])//判断file是否为非空
        && is_string($_REQUEST['file'])//判断file是否我i字符串
        && emmm::checkFile($_REQUEST['file'])//调用checkfile函数判断file返回值是否为true
    ) {
        include $_REQUEST['file'];
        //对传入的参数进行包含作用,即使丢失了文件仍然输出结果,不进行中断
        exit;
    } else {
        echo "<br><img src=\"https://up-gz.zsyts.cn/wp-content/uploads/2023/05/dc8ec3f518d2f1e39b15b7defd39d51b.jpg\" />";
    }  
?>

代码审计中遇到不理解的函数参考的文献:php中include的用法php中include的用法-PHP问题-PHP中文网,

mb_substr函数参照

php中常用的字符串截取函数mb_substr实例解释 – 百度文库

我们在代码中可以看到除了source.php还有hint.php,所以来到该网页后,如图:

【攻防世界】--warmup---(详细操作)做题笔记

他告诉我们flag不在这里,但是给与了其他提示,flag在ffffllllaaaagggg中,在代码审计中最后一段我们可以知道,需要三个条件都成立flie为非空,file为字符串,file通过构建的checkfile函数以后返回值是true。这样我们应该就可以得到flag。

…/以下是我的错误思路,

由于mb_substr()函数截取是从$page.?开始截取,所以应当构造payload为source.php?或者是hint.php?现在我们进行尝试(不过不太能理解为什么构造的payload是source.php?,而不是source.php.?,难道点  .  会被忽略掉吗?),现在比如直接拼接ffffllllaaaaggg,列如source.php?ffffllllaaaagggg,如图:

【攻防世界】--warmup---(详细操作)做题笔记

什么都没有,哎,参考了大佬的文档以后发现,2020-12-08_一个刚入门的菜鸡的博客-CSDN博客_checkfile函数,原来是我搞忘记构建file=xxxx了,继续改变构造,拼接source.php?file=ffffllllaaaagggg,这回有反应了,出现了反应,证明我的payload构建成功了一半,但是应该被第一个if(! isset($page) || ! is_string($page))拦截了,如图:

【攻防世界】--warmup---(详细操作)做题笔记

仔细观摩大佬的payload以后发现构建错误。

../以上为自己的一点错误思路过程。

正确的payload : source.php?file=source.php?/../../../../../../ffffllllaaaagggg。

【攻防世界】--warmup---(详细操作)做题笔记

 flag:flag{25e7bce6005c4e0c983fb97297ac6e5a}

 参考文章来自:【攻防世界】六、warmup_我是大肥鼠的博客-CSDN博客_攻防世界warmup

                       

点击阅读全文

上一篇 2023年 5月 25日 am11:07
下一篇 2023年 5月 25日 am11:09