预备知识:

文件包含相关知识:include 'xxx', 所包含的xxx文件会当作PHP代码执行。

include 'xxx/../123.php'# PHP中默认和 include './xxx/../123.php' 等效

首先这是一个相对路径,相对于当前目录而言
在解析这段路径的时候,首先先检查每一个目录名是否正确,此外,由于 / 的存在,会将xxx当作一个目录,即使这个目录并不存在,而../表示返回上一层目录,所以就是,进入当前目录下的xxx目录再返回上一个目录,结果依然在当前目录,最后在当前目录下寻找123.php。

CMD下

# 寻找123.php..这个目录下的123.php# 在win下这样写直接报错,因为123.php..会被win10系统强制改为123.php# 那么php在找123.php..这个目录的时候,就找不到了include '123.php../123.php'# 寻找上一层目录下的123.php# 这行代码不会报错,即使123.php..这个目录不存在。include '123.php../../../123.php' 相当于 include './132.php../../../123.php'# 123.php..当作一个目录存在# 两个../向上返回两层目录,对于当前目录而言,相当于返回上一层目录,最后寻找123.php,

PHP函数说明:

  1. in_array ():in_array() 函数搜索数组中是否存在指定的值。
<?php $people = array("Bill", "Steve", "Mark", "David");if (in_array("Mark", $people))  {  echo "匹配已找到";  }else  {  echo "匹配未找到";  }?>

2.mb_substr() : 用于截取字符串的长度。

<?php echo mb_substr("喵喵视角", 0, 2);  // 输出:视角//0代表从第零个位置开始,2代表截取的长度为2?>
  1. mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置。
<?php $str = 'miaomiaoshijiao';echo mb_strpos($str,'shi');//返回值为8?>

好啦,准备工作欧克了,开始看题目吧:

打开题目是一个猥琐的笑脸

打开F12 ,查看一下元素:

发现

访问一下source.php:

代码部分

 public static function checkFile(&$page)        {            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];            if (! isset($page) || !is_string($page)) {                echo "you can't see it";                return false;            }            if (in_array($page, $whitelist)) {                  return true;            }            $_page = mb_substr(   //该代码表示截取$page中'?'前部分,若无则截取整个$page                $page,                0,                mb_strpos($page . '?', '?')            );             if (in_array($_page, $whitelist)) {  //若$page变量存在于$whitelist数组中 ,返回true                return true;            }            $_page = urldecode($page);            $_page = mb_substr(                $_page,                0,                mb_strpos($_page . '?', '?')            );            if (in_array($_page, $whitelist)) {                return true;            }            echo "you can't see it";            return false;        }

我们主要看checkFile里的代码:可以看到,定义了白名单,我们访问白名单,发现了flag存在的文件。

然后这个就没用了。

  • 第一个if语句对变量进行检验,要求$page为字符串,否则返回false
  • 第二个if语句判断$page是否存在于$whitelist数组中,存在则返回true
  • 第三个if语句判断截取后的$page是否存在于$whitelist数组中,截取$page中'?'前部分,存在则返回true
  • 第四个if语句判断url解码并截取后的$page是否存在于$whitelist中,存在则返回true
    若以上四个if语句均未返回值,则返回false

$page = hint.php?../../ffffllllaaaagggg

mb_substr()将截取 $page, 截取内容为 hint.php

$_page = hint.php ,$_page 出现在 whitelist 中, 然后 return true; 执行 include $_REQUEST['file'] 也就是 include 'hint.php?../../ffffllllaaaagggg'

构造:?file=hint.php?../../.../ffffllllaaaagggg  (逐次往上一级目录跳转)//需要对?进行二次编码处理。

得到flag


总结:

  1. cd dasdas/../ 还是在当前目录
  2. windows下,由于目录不能出现特殊符号,所以对于本题的第三个if ,无法使用, 但是在Linux下,我们可以使用 file=hint.php?/../../../../etc/passwd

运行结果


菜鸡上路,多多关照,如有错误,欢迎指出。

php 字符串截取_网络安全WEB之PHP代码审计,攻防世界题目warmup相关推荐

  1. mysql 截取字符串部分值,Mysql字符串截取_获取指定字符串中的数据

    搜索热词 前言:本人遇到一个需求,需要在MysqL的字段中截取一段字符串中的特定字符,类似于正则表达式的截取,苦于没有合适的方法,百度之后终于找到一个合适的方法:substring_index('ww ...

  2. js 字符串截取_【js】让你一次性搞清楚slice,substr,substring字符串截取函数

    假设 str是个字符串变量,且设置值为"LittleAnn",字符长度是9 那么这三个函数使用方式: var 相同点: start为开始位置下标,end为结束位置下标 下标从0开始 ...

  3. c语言字符串截取_笔记 | 自学Python 05:数据类型之字符串

    字符串,就是一个个字符组成的有序的序列,是字符的集合,在python中通常使用单引号.双引号和三引号引住的字符序列,由数字.字母.下划线组成. 从以下6个方面来了解: ①字符串是不可变的 上一期我们介 ...

  4. .net mysql字符串截取_【MySQL】字符串截取之SUBSTRING_INDEX和【MySQL】字符串四则运算...

    substring_index(str,delim,count) str:要处理的字符串 delim:分隔符 count:计数 例子:str=www.google.com 1.count是正数,那么就 ...

  5. linux 字符串截取_第13篇:Linux防火墙的日志基本审计

    整个Linux日志管理,大体上就分为三个管理区块:日志的采集以及分析.轮转 rsyslog是一个系统的守护进程,绝大部分和操作系统有关的日志,例如系统安全.认证,计划任务等等都由该进程完成. 还有一些 ...

  6. c语言字符串截取_一文搞懂 C 语言 #、##、__VA_ARGS__

    1'#' 和 '##' 属于预处理标记.'#' 和 '##' 用于类似函数的宏定义中(或者简称为宏定义函数).2'__VA_ARGS__' 是 C99 引入的用于支持宏定义函数中使用可变参数. 操作符 ...

  7. mysql 截取括号内字符串_Mysql字符串截取_获取指定字符串中的数据

    前言:本人遇到一个需求,需要在MySql的字段中截取一段字符串中的特定字符,类似于正则表达式的截取,苦于没有合适的方法,百度之后终于找到一个合适的方法:substring_index('www.sql ...

  8. python3字符串截取_从python3中的字符串中获取特定文本

    只是使用 str.split() 和赋值给变量,还有一个默认的第二个参数可以帮助您处理唯一的total/free avail场景 def get_free_memory(ssh_obj, raw=Tr ...

  9. python控制语句字符串截取_菜鸟python---流程控制语句

    用户交互:(输入/输出) input(提示语句!) -- 输入 msg = input("请输入您内容:") int("5") ---> 5 print( ...

最新文章

  1. 核磁共振影像数据处理-2-DWI实践:计算ADC (MD) map、Li‘s have a solution and plan.
  2. python矩阵相加_【python矩阵相加怎么做,这可是证明python功能的大好机会】- 环球网校...
  3. SharePoint服务器修改域和机器名
  4. Android开发面试题Service之startService和bindService之间的区别
  5. Redis----windows下的常用命令
  6. 列表转化成数组_30. 把数组排成最小的数
  7. WIN10专业版64位21H2正式版19044.1826
  8. 数据库如何增加表中字段
  9. 【图像处理】多光谱 波长波段划分 主要波段特性 植被遥感原理 典型植被指数
  10. 启用共享文件夹服务器,Windows Server 2008 启用公共文件夹共享
  11. npm -i 与npm install -s与-d的区别
  12. linux系统安装绿色版mysql
  13. 华为平板鸿蒙发布,华为新款平板与P50一同发布!有望搭载鸿蒙系统
  14. Linux中zsh插件,Zsh 常用插件
  15. Python:strip() 函数
  16. 安司密信服务器维护,安司密信好用吗?安司密信使用教程[多图]
  17. 人物介绍的排版【小白进】
  18. 怎么会有两个“原本”
  19. 关于计算机方面的知识小故事,「计算机小故事」-奇妙的HelloWorld任务
  20. 董事会审计委员会职能是什么?

热门文章

  1. android的应用入口点函数,android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明...
  2. 博图wincc连接数据块_西门子博途WINCC 可通过创建画面模板提高编程效率
  3. 5分绩点转4分_作为一名大学生,如何规划4年大学生活?学姐:建议从这5点做起...
  4. 20211108 微分跟踪器
  5. 再说javascript 的__proto__ 和prototype 属性
  6. sql limit 的用法
  7. Follow My Logic 1048 PKU
  8. luogu3233 世界树 (虚树)
  9. [POJ1155]TELE
  10. iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)