跳到主要内容

鹤城杯 2021EasyP

<?php
include 'utils.php';

if (isset($_POST['guess'])) {
$guess = (string) $_POST['guess'];
if ($guess === $secret) {
$message = 'Congratulations! The flag is: ' . $flag;
} else {
$message = 'Wrong. Try Again';
}
}

if (preg_match('/utils\.php\/*$/i', $_SERVER['PHP_SELF'])) {
exit("hacker :)");
}

if (preg_match('/show_source/', $_SERVER['REQUEST_URI'])){
exit("hacker :)");
}

if (isset($_GET['show_source'])) {
highlight_file(basename($_SERVER['PHP_SELF']));
exit();
}else{
show_source(__FILE__);
}
?>

例如:http://127.0.0.1/phplab/?show[source=1

$_SERVER['PHP_SELF'])返回/phplab/index.php,返回当前运行脚本

$_SERVER['REQUEST_URI'])返回/phplab/?show[source=1,返回路径和参数

basename函数,返回路径中的文件名部分,即返回最后一个/后面的字符

其绕过原理为:在使用默认语言环境设置时,basename() 会删除文件名开头的非 ASCII 字符和中文

payload

index.php/utils.php/%ff?show[source=1
. [ 空格 +这四个在传参时会被解析成_