[Zer0pts2020]Can you guess it?(basename漏洞)

点击source

<?php
include 'config.php'; // FLAG is defined in config.php

if (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {
  exit("I don't know what you are thinking, but I won't let you read it :)");
}

if (isset($_GET['source'])) {
  highlight_file(basename($_SERVER['PHP_SELF']));
  exit();
}

$secret = bin2hex(random_bytes(64));
if (isset($_POST['guess'])) {
  $guess = (string) $_POST['guess'];
  if (hash_equals($secret, $guess)) {
    $message = 'Congratulations! The flag is: ' . FLAG;
  } else {
    $message = 'Wrong.';
  }
}
?>
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Can you guess it?</title>
  </head>
  <body>
    <h1>Can you guess it?</h1>
    <p>If your guess is correct, I'll give you the flag.</p>
    <p><a href="?source">Source</a></p>
    <hr>
<?php if (isset($message)) { ?>
    <p><?= $message ?></p>
<?php } ?>
    <form action="index.php" method="POST">
      <input type="text" name="guess">
      <input type="submit">
    </form>
  </body>
</html>

首先我的方法是利用里面的黑名单来测试在哪里传参,在输入框里输入1可以发现对应的是post方式参数guess 

然后我的注意力全部在

 random_bytes(num)生成num个随机的字符,bin2hex(str)将字符转化为十六进制数方便我们观察,这里我就想到会不会是之前做过的一个题目,只要种子一样,随机数其实是定下来的,也就是所谓的伪随机数,这里还有一个比较函数hash_squals,比较两个字符串是否一样

这里我就鬼使神差的将64当作一个种子,进行编码进行提交,发现是个wrong,在网上查找random_bytes的漏洞发现没有找到。

最后才知道这里考的是basename这个函数的漏洞basename()绕过小结 - Ye'sBlog - 博客园 

include 'config.php'; // FLAG is defined in config.php

if (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {
  exit("I don't know what you are thinking, but I won't let you read it :)");
}

if (isset($_GET['source'])) {
  highlight_file(basename($_SERVER['PHP_SELF']));
  exit();
}

$_SERVER['PHP_SELF']代表的当前php文件的绝对路径

 比如现在这个文件是在var/www/html/index.php,那么$_SERVER['PHP_SELF']代表的就是index.php,如果自己不太信的话,我们在原网页后面添加一个config.php看看会不会报错输出exit里面的语句

思路正确! 在看到下面if语句有一个highlight_file就肯定是远程文件包含漏洞了,现在我们的步骤是,如何让basename过后的文件名是config.php,再往前,如何让$_SERVER['PHP_SELF']代表config.php的时候同时绕过正则表达式,这就是我们的目标

不仔细看还看不出来,正则表达式其实应该是"/config.php/*$/i",注意这个$,它代表的是字符串末尾,意思就是只要我们config.php/后面加点东西就可以绕过了,现在就是basename的漏洞了

一个脚本跑了一下,发现后面的不可见字符绕过正则的同时而且会被basename忽略掉,从而依然是config.php,忽略不掉的config.php/m经过basename会变成m,但我这里不会在url连接上用不可见字符,看了别人的wp可以知道还有中文也可以绕过,汉字、?、《、》、;等中文字符,因为这里还要有一个source参数,因此我们可以构造payload为index.php/config.php/??source=记得第一个问号是中文的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值