web37
出现include($c); 本题过滤了flag
因为有include($c);的存在,所以我们需要进行文件上传,所以这次来学习data伪协议。
先上实操
解
然后execute
?c=data://text/plain,<?php system('tac f*');?>
- data://伪协议,是数据流封装器,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过包含你输入的payload来实现目的。
以我个人的理解就是有include($c); ,就表示他已经就帮我们写好了include$_GET[c];,之后我就只用在c中写入命令就行了,又因为限制我们要上传文件,所以我们要用data伪协议。
格式:
一般形式:data://text/plain,<?php 恶意命令?>
(php代码的格式:<?php 代码?>,php代码由<?开始,到?>结束,?>之后的代码无效(web39会有),其中php被过滤时,可以用=代替(web38会有))
base64编码形式:data://text/plain;base64,恶意代码的base64编码
接下来看web38-39
web38
本题过滤了flag php file
思路还是一样,过滤增加就绕过吗,就刚刚说的php被过滤可以用=代替,或者用base64编码形式
解1(=代替php)
解2(base64编码形式)
web39
本题过滤了flag
include($c.".php");比前几题多了.php,但是并不影响,没有了echo回显,且在$c后面增加了一个.php 后缀,原本是想要伪协议php://filter/convert.base64-encode/resource=flag,这样就能和后缀链接起来包含flag.php,但是因为过滤了flag,所以用data协议。
这个后缀是相当于include(data://text/plain,<?=phpinfo();?>.php),因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用。如果<>里面返回值为flag,所以最后为flag.php。
解
如果这题php被过滤,用=代替就行。