国外手机主题网站,虚拟机wordpress教程视频,网站如何跳转,泰安网络营销公司拿到题#xff0c;发现是一张图#xff0c;查看源代码发现了被注释掉的提示
!-- source.php--
step 1 在url传参看看这个文件#xff0c;发现了这道题的源码 step 2 开始审计代码#xff0c;分析关键函数 //mb_strpos($haystack,$needle,$offset,$encoding):int|…拿到题发现是一张图查看源代码发现了被注释掉的提示
!-- source.php--
step 1 在url传参看看这个文件发现了这道题的源码 step 2 开始审计代码分析关键函数 //mb_strpos($haystack,$needle,$offset,$encoding):int|false 返回要查找的字符串在另一个字符串中首次出现的位置 $ haystack要被检查的字符串。 $ needle要搜索的字符串。 $offset 可选用于定义从何处开始搜索字符串即搜索位置的偏移。如果没有提供该参数将会使用 0。负数的 offset 会从字符串尾部开始统计。 $encoding可选。用于通过使用定义编码mb_internal_encoding()。如果省略或是null则使用内部字符编码。 //mb_substr($str,$start,$length,$encoding) 中文截取函数函数返回字符串的一部分。 $str必需。从该 string 中提取子字符串。 $start必需。规定在字符串的何处开始。 正数 - 在字符串的指定位置开始 负数 - 在从字符串结尾的指定位置开始 0 - 在字符串中的第一个字符处开始 $length可选。规定要返回的字符串长度。默认是直到字符串的结尾。 $encoding网页编码如utf-8GB2312GBK
源码中出现了hint.php
step 3 url传参查看hint.php发现以下文字 flag not here, and flag in ffffllllaaaagggg 即获得了flag文件名。
step 4 继续分析代码
?phphighlight_file(__FILE__);
class emmm//定义了一个名为emmm的类在该类中有一个静态方法checkFile用于检查要包含的文件是否在白名单中白名单是一个关联数组$whitelist其中包含了允许包含的文件的键值对。在代码中允许包含的文件有sourcesource.php和hinthint.php。{public static function checkFile($page){$whitelist [sourcesource.php,hinthint.php];//第①次检查checkFile方法检查传入的$page参数是否为字符串类型如果不是或者未设置将输出you cant see it并返回false。if (! isset($page) || !is_string($page)) {echo you cant see it;return false;}
//第②次检查检查传入的$page是否直接在白名单中存在如果存在返回true。if (in_array($page, $whitelist)) {return true;}
//对$page参数进行一系列处理首先使用mb_strpos函数找到$page中第一个问号的位置然后使用mb_substr函数将问号之前的部分作为$_page进行处理。$_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 . ?, ?));//第③次检查检查传入的$page是否直接在白名单中存在if (in_array($_page, $whitelist)) {return true;}echo you cant see it;return false;}}
//将$_page进行URL解码并重复之前的处理步骤如果$_page在白名单中存在返回true。如果上述条件都不满足则输出you cant see it并返回false。if (! empty($_REQUEST[file]) is_string($_REQUEST[file]) emmm::checkFile($_REQUEST[file])) {include $_REQUEST[file];exit;} else {echo brimg src\https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\ /;}
?
现在构造获取flag的语句hint.php?../../../../../ffffllllaaaagggg
传入入checkFile函数要经历①白名单验证 ②过滤过滤后就是hint.php ③白名单验证返回为真则达成条件进行包含得到flag
注:include函数有这么一个神奇的功能以字符‘/’分隔而且不计个数若是在前面的字符串所代表的文件无法被PHP找到则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’。
这里的ffffllllaaaagggg是在hint.php中发现的显然flag在这个文件里。其实文件名提示了我们要使用四层目录。有四层目录原理source.php一般是在html目录下往上是www、var、根目录flag一般放在根目录下这里还有个hint.php?或者source.php?因此需要返回四层才能到根目录。
最终payload:
http://03b2cc85-7af4-439b-a06e-41da80ff6505.node3.buuoj.cn/index.php?filehint.php?../../../../../ffffllllaaaagggg
注若目标是根目录则可以多穿几层多穿无妨少穿什么都没有