[Zer0pts2020]Can you guess it?1

点击Source,去看一下.

开始审计.

php 复制代码
<?php  
// 包含配置文件,其中定义了FLAG常量  
include 'config.php';   
  
// 检查当前请求的脚本路径是否以'config.php/'结尾(不区分大小写,且'/'可以是0个或多个)  
// 如果匹配,则退出并显示一条消息,防止直接访问包含敏感信息的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 :)");  
}  
  
// 如果URL中存在'source' GET参数  
if (isset($_GET['source'])) {  
  // 使用basename函数获取当前脚本的基本名称(即去除任何路径信息),并高亮显示其源代码  
  // 这可能导致信息泄露,因为攻击者可以看到部分源代码  
  highlight_file(basename($_SERVER['PHP_SELF']));  
  exit(); // 在显示源代码后退出  
}  
  
// 生成一个随机的64字节秘密,并将其转换为十六进制字符串  
$secret = bin2hex(random_bytes(64));  
  
// 如果POST请求中包含了'guess'参数  
if (isset($_POST['guess'])) {  
  // 将'guess'参数的值转换为字符串  
  $guess = (string) $_POST['guess'];  
  // 使用hash_equals函数比较猜测和秘密(防止时间攻击)  
  if (hash_equals($secret, $guess)) {  
    // 如果猜测正确,显示FLAG  
    $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)) { ?>  
    <!-- 如果设置了$message变量,则显示它 -->  
    <p><?= $message ?></p>  
<?php } ?>  
    <!-- 提供一个表单,允许用户通过POST请求提交他们的猜测 -->  
    <form action="index.php" method="POST">  
      <input type="text" name="guess">  
      <input type="submit">  
    </form>  
  </body>  
</html>

这部分就不用想了,他每次出现的数字是随机的.

看看上面的.

一个正则表达式,一个highlight_file(basename($SERVER["PHP_SELF"])).

知识点 :

basename漏洞,basename可以匹配到可见字符,但是无法匹配不可见字符

示例:

书接上回,我们可以通过 highlight_file(config.php)来读取flag.

而basename($SERVER["PHP_SELF"]) <=>config.php的实现就用上面的basename漏洞来实现

同时我要还需要绕过正则表达式.

我们通过分析**'/config\.php\/*$/i',**可知正则表达式匹配条件为:

以 config.php 结尾,后面跟着零个或多个斜杠,且不区分大小写

所以我们在后面+点东西就可以绕过了,而+的东西就是不可见字符.

示例

理论成立开始实操

拿到flag,游戏结束~

相关推荐
A5rZ1 小时前
Puppeteer 相关漏洞-- Google 2025 Sourceless
网络安全
用户Taobaoapi20143 小时前
Taobao agent USA丨美国淘宝代购1688代采集运系统搭建指南
数据挖掘·php
蓝色记忆3 小时前
Classmap 如何兼容旧代码
php
Bruce_Liuxiaowei3 小时前
常见高危端口风险分析与防护指南
网络·网络安全·端口·信息搜集
2501_916013744 小时前
iOS 多线程导致接口乱序?抓包还原 + 请求调度优化实战
websocket·网络协议·tcp/ip·http·网络安全·https·udp
头发那是一根不剩了6 小时前
双因子认证(2FA)是什么?从零设计一个安全的双因子登录接口
网络安全·系统设计·身份认证
蓝色记忆6 小时前
Composer PSR-4 自动加载机制的完整流程
php
浩浩测试一下7 小时前
渗透信息收集- Web应用漏洞与指纹信息收集以及情报收集
android·前端·安全·web安全·网络安全·安全架构
Gappsong8749 小时前
【Linux学习】Linux安装并配置Redis
java·linux·运维·网络安全
only-lucky9 小时前
C语言socket编程-补充
服务器·c语言·php