[鹤城杯 2021]EasyP wp(代码审计)

文章介绍了在解决一个名为鹤城杯2021的CTF挑战时遇到的问题,涉及到PHP脚本中的$_SERVER[PHP_SELF]和basename函数的使用,以及如何利用PHP特性构造payload绕过preg_match正则限制,触发show_source来显示源代码。关键在于理解服务器变量的用法和利用非ASCII字符避开正则匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[鹤城杯 2021]EasyP

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

被狠狠地坑了一把,这题的secret变量是个坑,受不了了

先介绍$_SERVER(服务器变量)在本题中涉及的用法

$_SERVER[‘PHP_SELF’] //返回当前执行脚本的文件名。

$_SERVER[‘SCRIPT_URI’] //返回当前⻚面的 URI。

再介绍一个basename()

bashname命令用于获取路径中的文件名或路径名

官方实例:

<?php
echo "1) ".basename("/etc/sudoers.d", ".d").PHP_EOL;
echo "2) ".basename("/etc/sudoers.d").PHP_EOL;
echo "3) ".basename("/etc/passwd").PHP_EOL;
echo "4) ".basename("/etc/").PHP_EOL;
echo "5) ".basename(".").PHP_EOL;
echo "6) ".basename("/")
?>
1) sudoers
2) sudoers.d
3) passwd
4) etc
5) .
6)

这题正确的的解题方法是:我们需要绕过正则preg_match('/utils\.php\/*$/i', $_SERVER['PHP_SELF']),并且还要使show_source该变量存在,但是由于preg_match正则匹配,我们不能直接输入show_source=‘’,但是由于php的特性,会将遇到的第一个[ or .变为_,所以在构造payload的时候我们可以将show_source变为show[source

绕过preg_match正则方法是,在 index.php/utils.php后面添加一个非ascii表中的字符 (例如%ff)所以我们可以构造payload:

http://node4.anna.nssctf.cn:28204/index.php/utils.php/%ff?show[source=%27%27//这里的%27就是单引号
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leafzzz__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值