php 以-截取剩余的字符串_网络安全WEB之PHP代码审计,攻防世界题目warmup

预备知识:

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

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

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

134b799e44bf6a3c38ffe94446988b23.png

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?>

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

e62da0737f7d356ff1768dc7b92a40f1.png

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

打开F12 ,查看一下元素:

c554666595489be5767f59b1914daeb1.png

发现

访问一下source.php:

ee6fb3121755ad0c788ed05cf7f1a0e7.png

代码部分

 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存在的文件。

fa89b646c592b18e83a4fab7b87ca6cd.png

然后这个就没用了。

  • 第一个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  (逐次往上一级目录跳转)//需要对?进行二次编码处理。
afd5f492a5729b1ce0042108c46db39c.png

得到flag


总结:

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

运行结果


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值