1.题目给出提示php代码审计,那我们在解题的时候,可能会涉及到php代码,我们注意留意一下。
2.来到题目链接,页面显示一个表情包
3.ctrl+u查看源码看看有没有什么有用的信息,我们看到页面中有个显眼的source.php
4.访问source.php,使用/?file=source.php访问发现有一些代码
<?php highlight_file(__FILE__); class emmm { public static function checkFile(&$page) { $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; } $_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 "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; } ?>
5.这段代码是一个 PHP 脚本。
它定义了一个名为 emmm 的类。这个类有一个静态方法 checkFile(&$page),用于检查传入的文件名是否在白名单中。如果文件名在白名单中,它会返回 true,否则返回 false。
白名单中包含了两个文件名:source.php 和 hint.php。
如果用户通过请求参数传递了一个名为 file 的值,并且这个值是一个字符串,那么它会调用 emmm::checkFile($_REQUEST['file']) 来检查这个文件名是否在白名单中。如果在白名单中,它会包含这个文件并退出脚本;否则,它会输出一张图片。
如果用户没有传递 file 参数,或者传递的值不是一个字符串,它会输出一张图片。
6.综上我们可以构造一个file的参数来访问我们最终存在flag的文件
7.有两个php文件,source.php 和 hint.php
8.接下来访问hint.php
9.页面提示flag在ffffllllaaaagggg这个文件里
10.所以我们可以构造/?file=source.php?../ffffllllaaaagggg(../的个数不确定,所以我们需要一个个试一下)这里我们试了一个,还是不能看到。
11.试了一下source.php?,还是不可以
12.直到试了多个../才看到页面有显示试了5个../才成功拿到flag
13.flag{037a0561-f82d-45e2-9f5f-8f8c8c423be1}