关于CTF中basename();绕过题为什么前面一定要加index.php

basename();绕过目前就碰到两道题 :
NSS——[鹤城杯 2021]EasyP
BUU——[Zer0pts2020]Can you guess it

以NSS这道为例,先放个源码。

<?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__);
}
?> 

很多人有疑问为什么/utils.php/哈哈?show[source不可以,非要前面加一个index.php,payload是/index.php/utils.php/哈哈?shouw[source才行,/utils.php/哈哈?show[source确实可以绕过上述种种限制,但如果你的payload是/utils.php/哈哈?show[source,那么访问的就不再是index.php,也就不再运行index.php的代码逻辑,那么payload是否能绕过又有何意义?而前面加一个index.php可以让我们访问的仍然是index.php,至于这个为什么,因为$_SERVER[‘PHP_SELF’]会获取我们当前执行脚本的文件名,并且PHP在根据URI解析到对应文件后会忽略掉URL中多余的部分,即只要index.php页面存在,如下两种URL均访问的是index.php而不受untils.php的影响。

/index.php
/index.php/untils.php

参考:[鹤城杯 2021]EasyP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值