蒙ICP备20000510号-2
【Zer0pts2020】Can you guess it?
Zer0pts    2020-06-02 21:07:30    62    0    0
during   Zer0pts
<?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.';
  }
}
?>

后面的部分没有查到漏洞,应该是无法碰撞出来,显示代码的highlight_file()函数使用了basename($_SERVER['PHP_SELF'])传参,只要将此处的值变为config.php就能读到flag,关键是如何绕过正则的限制,是url后部解析为config.php?source


$_SERVER['PHP_SELF']表示当前 php 文件相对于网站根目录的位置地址,规则如下

http://www.5idev.com/php/ :/php/index.php
http://www.5idev.com/php/index.php :/php/index.php
http://www.5idev.com/php/index.php?test=foo :/php/index.php
http://www.5idev.com/php/index.php/test/foo :/php/index.php/test/foo

basename返回路径中的文件名部分

basename(path,suffix)​
path	必需。规定要检查的路径。
suffix	可选。规定文件扩展名。如果文件有 suffix,则不会输出这个扩展名。

$path = "/testweb/home.php";

//显示带有文件扩展名的文件名
echo basename($path); //home.php

//显示不带有文件扩展名的文件名
echo basename($path,".php"); //home

此处利用点为basename函数的特性:在遇到非ascii字符时会将其舍弃

官方描述:https://bugs.php.net/bug.php?id=62119

即当url为:basename("config.php/xff")实际为config.php,利用这个特点可以绕过正则的匹配:preg_match('/config\.php\/*$/i')

于是构造:

http://188e61e8-604c-4896-a4bc-6c20f1b596b8.node3.buuoj.cn/index.php/config.php/%ff?source







上一篇: 【网鼎杯 朱雀组】Nmap

下一篇: 【SWPUCTF】Android1

62 人读过
文档导航