BUUCTF

[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

 

你可能感兴趣的:(BUUCTF)