首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

攻防世界 - Web - Level 2 | warmup

  • 25-02-16 18:20
  • 2896
  • 12562
blog.csdn.net

关注这个靶场的其它相关笔记:攻防世界(XCTF) —— 靶场笔记合集-CSDN博客

0x01:考点速览

本题考察的是 PHP 代码审计与目录遍历漏洞,想要通过本关,你需要了解以下知识点:

  • mb_strpos($str, $search_str) -> 查找 中第一次出现​search_str 的地方。

  • 系统路径 bug,当路径中出现 /../ 时第一个文件名多离谱都可以成功访问路径。

0x02:Write UP

登录页面,可以看到一张贱贱的笑脸:

老规矩,右击页面,查看网页源码,找找提示:

访问 source.php 文件,就可以看到后端的 PHP 过滤代码:

简单的做一下代码审计,内容我都以注释的形式展示:

  1.  
  2.  highlight_file(__FILE__);
  3.  class emmm
  4.  {
  5.      public static function checkFile(&$page)       // checkFile 检查逻辑 $page 即我们传入的 file
  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)) {              // 如果文件在白名单中, return true
  14.              return true;
  15.         }
  16.  
  17.          $_page = mb_substr(                             // mb_substr -> 按规定截取文件中指定位置的字符串
  18.              $page,                                      
  19.              0,
  20.              mb_strpos($page . '?', '?')                 // 将 $page 加上 ? 号后,再查找第一次出现 ? 的地方
  21.         );
  22.          if (in_array($_page, $whitelist)) {             // 将截取后的字符串再与白名单中的文件名比较
  23.              return true;
  24.         }
  25.  
  26.          $_page = urldecode($page);                      // 对传入的 file 进行 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 (
  41.      !empty($_REQUEST['file'])
  42.      && is_string($_REQUEST['file'])
  43.      && emmm::checkFile($_REQUEST['file'])           // 接收参数 file, 要求 file 必须为字符串并且会对 file 进行检查
  44.  ) {
  45.      include $_REQUEST['file'];                      // 如果 checkFile 返回 true, 则包含目标文件
  46.      exit;
  47.  } else {
  48.      echo "
    "
    ;
  49.  }

在 checkFile 函数中,白名单有两个页面,一个是 source.php 另一个是 hint.php,我们进入 hint.php 查看一下:

很诚实,告诉了我们保存 Flag 的文件名:ffffllllaaaagggg。

在 checkFile 函数中,目标有三次返回 true 的机会,第一次直接检查是否在白名单中,第二次根据问号截取后再检查是否在白名单中,第三次在 url 解码后重复第二次的过程。很明显,绕过第二次会比较简单,谁让?号可控呢。

如此,我们可以构造 Payload 如下:

 ?file=hint.php?/ffffllllaaaagggg

可以看到页面并没有鸟我们,但是也没有输出 “you can’t see it”,下面要做的就是不断往上级目录遍历即可,最终的 Payload 如下:

0x03:Payload 解析

为了防止部分读者无法看懂上面的 Payload,所以笔者特意写了此节来介绍一下上面那个 Payload 的诞生原理:

首先对于初始的 Payload :?file=hint.php? 这部分我相信疑问应该是比较少的。

按照上面的 Payload,目标后端接收到的数据实际为 hint.php?,而我绕过的是第二个判断:

  1.  
  2.  $_page = mb_substr(
  3.      $page,
  4.      0,
  5.      mb_strpos($page . '?', '?')     // $page = "hint.php?"; -> mb_strpos("hint.php?" . '?', '?'); -> return 8
  6.  );    // $_page = mb_substr("hint.php?", 0, 8); -> $_page = "hint.php";
  7.  if (in_array($_page, $whitelist)) {
  8.      return true;
  9.  }

至此,checkFile 已经 return true 了,下面就进入了文件包含阶段。

 include $_REQUEST['file'];

在这里我要做一个小实验,在 Windows 中按 Win+R 输入 cmd 即可进入实验环境,实验的过程如下:

可以看到,无论我一开始的文件名存不存在,当我在后面加上 ../ 时,他都不会报错,甚至可以进入目录。依据此表现,我们就可以理解本题 Payload 最后包含的内容:

 include hint.php?/../../../../ffffllllaaaagggg

他在执行包含的时候忽略了 hint.php? ,导致成功目录穿越包含到了 ffffllllaaaagggg 文件。

 

注:本文转载自blog.csdn.net的Blue17 :: Hack3rX的文章"https://blog.csdn.net/m0_73360524/article/details/144653234"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top